Python笔记(2)

这篇博客主要介绍了Python中的字典,包括定义、组成、操作和相关函数。接着,讲解了模块的定义和引用。重点在于Python3的面向对象编程,包括类定义、对象、类方法、继承、多继承以及方法重写。最后,博主提出了面向对象化的作业题目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.字典

 

1.定义

是另一种可变容器模型,且可存储任意类型对象。

2.组成

键key(类似于数据元素)和值value(类似于数据元素项)———字典(类似于数据对象)

                                    

3.操作

  • 访问字典里的值
dict={'name':'小明','age':'19','class':'一班'}
print("dict['name']",dict['name'])
print("dict['age']",dict['age'])
print("dict['class']",dict['class'])
  • 修改字典
dict={'name':'小明','age':'19','class':'机电一班'}

dict['name']='小红'
print("dict['name']",dict['name'])
print("dict['age']",dict['age'])
print("dict['class']",dict['class'])
  • 删除字典

del dict [ 'name' ]  #删除name

dict.clear()            #清空字典

del  dict               #删除字典

  • 字典键的特性

1)不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住

2)键必须不可变,所以可以用数字,字符串或元组充当,而用列表就不行 

4.函数

  • 计算字典元素个数,即键的总值:len(dict)
  • 输出字典:str(dict)
  • 返回输入的变量类型:type(dict)
1radiansdict.clear()
删除字典内所有元素
2radiansdict.copy()
返回一个字典的浅复制
3radiansdict.fromkeys()
创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值
4radiansdict.get(key, default=None)
返回指定键的值,如果键不在字典中返回 default 设置的默认值
5key in dict
如果键在字典dict里返回true,否则返回false
6radiansdict.items()
以列表返回一个视图对象
7radiansdict.keys()
返回一个视图对象
8radiansdict.setdefault(key, default=None)
和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default
9radiansdict.update(dict2)
把字典dict2的键/值对更新到dict里
10radiansdict.values()
返回一个视图对象
11pop(key[,default])
删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。
12popitem()
随机返回并删除字典中的最后一对键和值。

二.模块

1.定义

如果你从 Python 解释器退出再进入,那么你定义的所有的方法和变量就都消失了。为此 Python 提供了一个办法,把这些定义存放在文件中,为一些脚本或者交互式的解释器实例使用,这个文件就是块。

2.引用

  • 引用标准库
#文件名:using_sys.py

import sys #引入python标准库中的sys.py模块

print('命令行参数如下:')
for i in sys.argv:  #sys.arge是一个包含命令行参的列表
    print(i)

print('\n\nPython 路径为:',sys.path,'\n') #sys.path 包含了一个 Python 解释器自动查找所需模块的路径的列表

三.Python3面向对象

  • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
  • 方法:类中定义的函数。
  • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
  • 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
  • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
  • 局部变量:定义在方法中的变量,只作用于当前实例的类。
  • 实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
  • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
  • 实例化:创建一个类的实例,类的具体对象。
  • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

1.类定义

可以通过类名访问其属性,__init__() 方法可以有参数,参数通过 __init__() 传递到类的实例化操作上

#格式

class Student:

     <声明1>

     ............

    <声明N>

2.对象

  • 属性引用:Python 中所有的属性引用一样的标准语法:obj.name
  • 实例化:类命名空间中所有的命名都是有效属性名
  1. 无参数的
  • class student:
       i=111              #类里边的一个属性
       def f(self):        #类里边的一个属性
           return "Hello World"
    
    x=student()  #实例化
    
    print("MyClass 类的属性 i 为:",x.i)
    print("MyClass 类的属性 f() 为:",x.f())

    (2).有参数的:参数通过__init__传递到实例化操作上

  • class Student:
       def __init__(self,name,num):    #方法构造
          self.name=name
          self.num=num
    
    x=Student('小明',20)   #参数传输
    
    print(x.name,x.num)
  • self是代表类的实例,类方法必须有一个额外的第一参数名称,一般我们将它写为self(不是关键字,可以用别的来替换),这个参数是代表对象的地址 
  • class Text:
       def prt(self):
           print(self)  #看一下class是否是地址
           print(self.class)  #看一下self.class是否指向对象
    
    t=text()
    t.prt()

3.类方法

在类的内部,使用 def 关键字来定义一个方法


#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))
 
# 实例化类
p = people('runoob',10,30)
p.speak()

4.继承

子类(派生类 DerivedClassName)会继承父类(基类 BaseClassName)的属性和方法。

BaseClassName(实例中的基类名)必须与派生类定义在一个作用域内。除了类,还可以用表达式,基类定义在另一个模块中时这一点非常有用

#定义
class DerivedClassName(BaseClassName):
    <statement-1>
    .
    .
    .
    <statement-N>

5.多继承

需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法。

#定义
class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>

6.方法重写

 
class Parent:        # 定义父类
   def myMethod(self):
      print ('调用父类方法')
 
class Child(Parent): # 定义子类
   def myMethod(self):
      print ('调用子类方法')
 
c = Child()          # 子类实例
c.myMethod()         # 子类调用重写方法
super(Child,c).myMethod() #用子类对象调用父类已被覆盖的方法

四.面向对象化作业

【问题】
人和机器猜拳游戏写成一个类,有如下几个函数:
1)函数1:选择角色 1 曹操 2张飞 3 刘备
2)函数2:角色猜拳 1剪刀 2石头 3布 【玩家输入一个1-3的数字】
3)函数3:电脑出拳 随机产生1个1-3的数字,提示电脑出拳结果
4)函数4:角色和机器出拳对战,对战结束后,最后出示本局对战结果…赢…输,然后提示用户是否继续?【按y继续,按n退出】
5)最后结束的时候输出结果 角色赢几局 电脑赢几局,平局几次 游戏结束2、人和机器猜拳游戏写成一个类,有如下几个函数:
【思路】
主部分:人机交互,嵌入角色选取和玩家出拳
将角色和猜拳对应的数值用字典来表示
【难点】
1.判断玩家和电脑的输赢的算法(剪刀1-布3==-2,石头2-剪刀1===1,布3-石头2==1)
2.电脑随机出拳,直接用随机函数
【问题】
1.用print会出错误,所以有值传递的时候用的事return
2. could not convert string to float:把减号两边位置调换
3.int()如果要转负数的浮点要先转float在转int
import random #导入随机函数,后边电脑随机出拳需要用到

#类定义
class YX():
    role_dict={1:"曹操",2:"张飞",3:"刘备"}  #字典定义
    CQ_dict={1:"剪刀",2:"石头",3:"布"}
    #获取角色函数
    def get_role_name(self):
        role_num=int(input("请选择角色:1.曹操 2.张飞 3.刘备\n"))
        return self.role_dict[int(role_num)]
    #获取剪刀石头布
    def get_role_CQ(self):
        CQ_num=input("请出拳:1.剪刀 2.石头 3.布\n")
       # return self.CQ_dict[int(CQ_num)]
        return int(CQ_num)
    #电脑出拳
    def get_computer_CQ(self):
        CQ_num=random.randint(1,3)
        print("电脑出拳:{}",format(CQ_num))
       # return self.CQ_dict[int(CQ_num)]
        return  int(CQ_num)
    #人机交互
    def games(self):
        role_win=0 #角色赢
        computer_win=0 #电脑赢
        PJ=0  #平局
        role_name=self.get_role_name() #获取角色名字
        while True:   #反复进行游戏,直到按下N退出
            role_CQ=self.get_role_CQ()  #角色猜拳
            computer_CQ=self.get_computer_CQ() #电脑猜拳
            print(role_name+"出拳为{},电脑出拳为{}".format(self.CQ_dict[role_CQ],self.CQ_dict[computer_CQ])) #输出玩家和电脑的猜拳内容
            if role_CQ-computer_CQ==1 or role_CQ-computer_CQ==-2: #当相减结果为-2或者1时,赢家
                role_win+=1
                print("玩家赢!")
            elif role_CQ-computer_CQ==-1 or role_CQ-computer_CQ==2:  #这个不要把computer_CQ作为被减数,否则会报错误(原因我也不知道)
                computer_win+=1
                print("电脑赢了!")
            elif computer_CQ==role_CQ:
                PJ+=1
                print("平局")
            choose=int(input("是否继续游戏?继续请按y 结束请按n"))
            if choose=="n":
                break
        print("玩家赢了{}局,电脑赢了{}局",role_win,computer_win)

if __name__=="__main__":   #用于模块启动的程序入口
    YX().games()      #执行game里边的程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值