Python -- 上
一、变量
1、变量的命名和使用
2、使用方法修改字符串的大小写
①以首字母大写的方式显示每个单词,使用 title() 方法
message="this is I study Python first day" print(message.title())
②将字符串全部修改为大写或者小写,使用方法 upper() 和 lower()
message="this is I study Python first day" print(message.upper()) print(message.lower())
3、拼接字符串
python使用加号(+)来拼接字符串。
name="zhangsan" address="beijing" message=name+"-"+address print(message) message=name+" "+address print(message)
简单问候语
first_name="ada" last_name="lovelace" full_name=first_name+" "+last_name print(full_name) print("Hello,"+full_name.title()+"!")
可以使用拼接来创建信息,再把整条消息都存储在一个变量中
first_name="ada" last_name="lovelace" full_name=first_name+" "+last_name message="Hello,"+full_name.title()+",happy!" print(message)
4、使用制表符或换行符来添加空白
在编程中,空白泛指任何非打印字符,如空格、制表符和换行符。可使用空白来组织输出,使其更易读。
要在字符串中添加制表符,可使用字符组合 \t
print("Python") print("\tpython")
要在字符串中添加换行符,使用字符组合 \n
print("Linux\nPython\nMySQL")
5、删除空白
删除字符串末尾的空白,使用方法 rstrip()
message="Python " message
message.rstrip()
要永久删除这个字符串中的空白,必须将删除操作的结果返回到变量中
message=message.rstrip()
message
删除字符串开头的空白,使用方法 lstrip()
message=" Python " message.lstrip()
删除字符串两端的空白,使用方法 strip()
message=" Python " message.strip()
6、使用字符串避免语法错误
①一对双引号中存在单引号可以正常输出,一对单引号中存在双引号可以正常输出。
②一对单引号中存在单引号会报错,一对双引号中存在双引号会报错,因为python会将第一对单引号或双引号视为字符串,其余的文本视为python代码,从而引发错误。
7、函数str()
将python中的非字符串表示为字符串,如果不进行转换会报错。
age=25 message="happy "+str(age)+"rd birthday" print(message)
Python之禅:在Python终端会话中执行命令import this。
二、列表简介
列表是由一系列按特定顺序排列的元素组成,可以创建包含字母表中的所有字母,数字0~9或所有家庭成员姓名的列表,也可以将任何东西加入列表中,其中的元素之间可以没有任何关系。
在Python中,用方括号([ ])表示列表,并用逗号来分割其中的元素。
#列表包含几类自行车
bicycles = ['trek','cannondale','redline','specialized'] print(bicycles)
如果让python将列表打印出来,python将打印列表的内部所有,包括方括号。
1、列表是有序集合,因此要访问列表的任何元素,只需将该元素的位置或索引告诉python即可,要访问列表元素,可指出列表的名称,再指出元素的索引,并将其放在方括号内。
#提取第一款自行车 bicycles = ['trek','cannondale','redline','specialized'] print(bicycles[0])
当请求获取列表元素时,Python只返回该元素,而不包括方括号和引号。
#输出第一款自行车,首字母大写,使用title()方法 bicycles = ['trek','cannondale','redline','specialized'] print(bicycles[0].title())
2、索引从0而不是1开始
在python中,第一个列表元素的索引是0而不是1,第二个列表元素的索引是1,按照这种计算方式,要访问列表的任何元素,都可将其位置减1
#访问索引1和3处的自行车,返回列表中的第二个和第四个元素 bicycles = ['trek','cannondale','redline','specialized'] print(bicycles[1]) print(bicycles[3])
3、Python访问最后一个列表元素提供了一种特殊语法,通过索引指定为 -1 ,可让Python返回最后一个列表元素。
bicycles = ['trek','cannondale','redline','specialized'] print(bicycles[-1])
索引 -2 返回倒数第二个列表元素,索引 -3 返回倒数第三个列表元素,以此类推。
4、使用列表中的各个值
可像使用其他变量一样使用列表中的各个值,可以使用拼接根据列表中的值创建信息。
bicycles = ['trek','cannondale','redline','specialized'] message="my first bicycle was "+bicycles[0].title()+"." print(message)
5、修改、添加和删除元素
创建的大多数列表都将是动态的,列表将随着程序的运行增删元素。
①修改列表元素的语法与访问列表元素的语法类似,要修改列表元素,可指定列表名和要修改的元素的索引,再指定该元素的新值。
#修改第一个人物的名字为"赵信" student=['锐雯','盖伦','亚索','璐璐'] print(student) student[0]="赵信" print(student)
可以修改任何列表元素的值。
②在列表中添加元素
在列表末尾添加元素,使用 append() 方法
#在列表末尾添加一个人物”剑圣“ student=['锐雯','盖伦','亚索','璐璐'] print(student) student.append('剑圣') print(student)
可以先创建一个空列表,再使用 append() 方法去添加
figure=[] figure.append('诺手') figure.append('木木') figure.append('狼人') print(figure)
在列表的任何位置插入元素 -- insert()
#在索引2处添加一个人物”拉克丝“ student=['锐雯','盖伦','亚索','璐璐'] print(student) student.insert(2,'拉克丝') print(student)
③从列表中删除元素 -- del
#删除索引位置0的人物 student=['锐雯','盖伦','亚索','璐璐'] print(student) del student[0] print(student)
④使用方法 pop() 删除元素
有时候需要将元素从列表中删除, 并接着使用它的值,方法 pop() 可删除列表末尾的元素,并让你能够接着使用它。
术语弹出(pop)源自这样的类比:列表就像一个栈,而删除列表末尾的元素相当于弹出栈顶元素。
#删除列表最后一个元素,并继续使用其值 student=['锐雯','盖伦','亚索','璐璐'] print(student) figure=student.pop() print(student) print(figure)
⑤使用 pop() 方法弹出任何位置处的元素。
可以使用pop() 来删除列表中任何位置的元素,只需在括号中指定要删除的元素的索引即可。
#删除索引位置2的人物 student=['锐雯','盖伦','亚索','璐璐'] figure=student.pop(2) print(figure) print("I like use a figure is"+figure)
※如果要从列表中删除一个元素,且不再以任何方式使用它就用 del 语句;如果要在删除元素后还继续使用,就使用方法 pop()
⑥根据值删除元素
不知道列表中删除值的所处位置,知道想删除元素的值,可以使用 remove() 方法。
#从列表中删除“亚索‘ student=['锐雯','盖伦','亚索','璐璐'] print(student) student.remove("亚索") print(student)
※方法 remove() 只删除列表中第一个指定的值,如果要删除的值在列表中出现多次,就需要使用循环来判断是否删除了所有这样的值。
6、组织列表
元素的排列顺序常常是无法预测的,需要特定的顺序呈现信息。
①使用方法 sort() 对列表进行永久性排序
#对自行车按照字母顺序排序 bicycles = ['trek','cannondale','redline','specialized'] bicycles.sort() print(bicycles)
方法 sort() 永久性的修改了列表元素的排列顺序,无法恢复到原来的排列顺序。
②反向排序,向 sort() 方法传递参数 reverse=True
#将自行车按照反向按照字母排序 bicycles = ['trek','cannondale','redline','specialized'] bicycles.sort(reverse=True) print(bicycles)
③使用函数 sorted() 对列表进行临时排序
要保留列表元素原来的排列顺序,同时以特定的顺序呈现他们,可使用函数 sorted() ,函数 sorted() 能够按照特定顺序显示列表元素,同时不影响它们在列表中的原始排列顺序。
#对自行车按照字母临时排序 bicycles = ['trek','cannondale','redline','specialized'] print(bicycles) print(sorted(bicycles)) print(bicycles)
按与字母顺序相反的顺序显示列表,可向函数 sorted() 传递参数 reverse=True
bicycles = ['trek','cannondale','redline','specialized'] print(bicycles) print(sorted(bicycles,reverse=True))
④倒着打印列表
要反转列表元素的排列顺序,使用方法 reverse()
#倒着打印列表 student=['锐雯','盖伦','亚索','璐璐'] student.reverse() print(student)
reverse() 不是指按与字母顺序相反的顺序排列列表元素,只是反转列表元素的排列顺序。
reverse() 方法可以永久性的修改元素的排列顺序,但可随时恢复到原来的排列顺序,为此只需对列表再次调用reverse() 即可
7、确定列表的长度
使用 len() 可快速获悉列表的长度
student=['锐雯','盖伦','亚索','璐璐'] len(student)
三、操作列表
1、for 循环
figure=['锐雯','盖伦','亚索','璐璐'] for item in figure: print("I Like use "+item+"!")
for 循环后面,没有缩进的代码都执行一次,而不会重复执行。
figure=['锐雯','盖伦','亚索','璐璐'] for item in figure: print("I Like use "+item+"!") print("Do you like play LOL?")
2、创建数值列表
①使用函数 range()
for item in range(1,5): print(item)
range() 前闭后开。
②range()创建数字列表
要创建数字列表,可使用函数 list() 将 range() 的结果直接转换为列表,如果将 range() 作为 list() 的参数,输出将作为一个数字列表
number = list(range(1,6)) print(number)
使用函数 range() 时,可指定步长。
number = list(range(1,10,2)) print(number)
使用函数range() 几乎能够创建任何需要的数字集
#将前10个整数的平方加入到一个列表中 number = [] for item in range(1,11): total=item ** 2 number.append(total) print(number)
#为了使代码简洁,可不使用临时变量total number = [] for item in range(1,11): number.append(item**2) print(number)
③专门对数字列表执行统计计算的函数
min -- 显示列表中的最小值
max -- 显示列表中的最大值
sum -- 统计列表中数值的总和
number = list(range(0,21)) print(number) print(min(number)) print(max(number)) print(sum(number))
3、列表解析
列表解析只需编写一行代码就能生成这样的列表,列表解析将 for 循环和创建新元素的代码合并成一行,并自动附加新元素。
number = [item ** 2 for item in range(1,11)] print(number)
4、切片
切片可以处理列表的部分元素,创建切片要指定使用的第一个元素和最后一个元素的索引。与函数range() 一样,Python在到达指定的第二个索引前面的元素停止,要输出列表中的前三个元素,需要指定索引0~3,这将分别输出0、1、2的元素。
figure=['锐雯','盖伦','亚索','璐璐','剑姬','安妮','盲僧'] print(figure[0:4])
#如果没有指定第一个索引,Python将自动从列表开头开始 figure=['锐雯','盖伦','亚索','璐璐','剑姬','安妮','盲僧'] print(figure[:6])
#让切片从列表的某个索引到列表末尾 figure=['锐雯','盖伦','亚索','璐璐','剑姬','安妮','盲僧'] print(figure[2:])
负数索引可以返回离列表末尾相应距离的元素。
#输出最后三个人物的名字 figure=['锐雯','盖伦','亚索','璐璐','剑姬','安妮','盲僧'] print(figure[-3:])
5、遍历切片
遍历列表中的部分元素,可在for循环中使用切片。
figure=['锐雯','盖伦','亚索','璐璐','剑姬','安妮','盲僧'] for item in figure[:5]: print(item)
6、复制列表
复制列表可创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引(:),这让python创建一个始于第一个元素,终止于最后一个元素的切片,即复制整个列表。
figure = ['锐雯','盖伦','亚索','璐璐','剑姬','安妮','盲僧'] student = figure[:] print(figure) print(student)
7、元组
列表非常适合用于存储在程序运行期间可能变化的数据集。列表是可以修改的,有时候需要创建一系列不可修改的元素,元组可以满足这种修改,Python将不可修改的值称为不可变的,而不可变的列表称为元组。
元组看起来犹如列表,但是使用圆括号而不是方括号来标识。定义元组后,就可以使用索引来访问其元素,就像访问列表元素一样。
figure = ('亚索','锐雯','卡特') print(figure)
元组不允许修改元素的值
①遍历元组中的所有值
像列表一样,也可以使用for循环来遍历元组的所有值
figure = ('亚索','锐雯','卡特') for item in figure: print(item)
②修改元组变量
虽然不能修改元组的元素,但可以给存储元组的变量赋值。
figure = ('亚索','锐雯','卡特') print(figure) figure = ('赵信','盖伦','剑圣','诺手') print(figure)
相比于列表,元组是更简单的数据结构,如果需要存储的一组值在程序的整个生命周期内都不变,可使用元组。
四、if 语句
在Python中,if语句能够检查程序的当前状态,并据此采取相应的措施。
#遍历列表,如果是”trek“,字母全部大写,其他的都是首字母大写 bicycles = ['trek','cannondale','redline','specialized'] for item in bicycles: if item == 'trek': print(item.upper()) else: print(item.title())
每条 if 语句的核心都是一个值为 True 或 False 的表达式,这种表达式称为条件测试。Python 根据条件测试的值为 True 还是 False 来决定是否执行 if 语句中的代码,如果条件测试的值为 True,Python 就执行紧跟在 if 语句后面的代码;如果为 False,Python就忽略这些代码。
①大多数条件测试都将一个变量的当前值和特定值进行比较,最简单的条件测试检查变量的值是否与特定值相等。
bicycle = 'trek' bicycle == 'trek'
bicycle = 'trek' bicycle == 'redline'
两个大小写不相同的值会被视为不相等。
如果大小写无关紧要,只是想检查变量的值,可将变量的值转换为小写再进行比较。
bicycle = 'TREK' bicycle.lower() == 'trek'
②检查是否不相等
要判断两个值是否不等,可结合使用叹号和等号(!=),叹号表示不
bicycles = ['trek','cannondale','redline','specialized'] for item in bicycles: if item != 'apple': print('这不是自行车')
③比较数字
1、检查多个条件
需要两个条件都为 true 时才执行的操作或只要求一个条件为 true 时就执行相应的擦欧总,需要用到 and 和 or
①使用 and 检查多个条件,两边都为 true 才返回 true,有一个为 false 则返回 false
age = 20 age_1 = 25 age == 20 and age_1 == 25
②使用 or 检查多个条件,两边有一个是 true 则返回 true,两边都为 false 才返回 false
age = 20 age_1 = 25 age == 20 or age_1 == 100
2、检查特定值是否包含在列表中,使用 in
执行操作前检查列表中是否包含特定的值,要判断特定值是否已经在列表中,可使用关键字 in
bicycles = ['trek','cannondale','redline','specialized'] 'trek' in bicycles
3、检查特定值是否不包含在列表中,使用 not in
bicycles = ['trek','cannondale','redline','specialized'] figure = 'monkey' if figure not in bicycles: print(figure+"is an animal")
4、布尔表达式
布尔表达式是条件测试的别名,与条件表达式一样,布尔表达式的结果要么为 True,要么为 False
布尔表达式通常用于记录条件,如游戏正在运行,或用户是否可以编辑网站的特定内容。
game_active = True
can_edit = False
※else是一条包罗万象的语句,只要不满足任何 if 或 elif 中的条件测试,其中的代码就会执行,这可能会引入无效甚至恶意的数据,如果知道最终要测试的条件,应考虑使用一个elif代码块来代替else代码块,这样就可以肯定,仅当满足相应的条件时,代码才会执行。
※if-elif-else结构功能强大,且仅适合用于一个条件满足的情况,遇到通过了的测试,Python就跳过余下的测试。
※单独使用代码块时,如果关心每个条件,就需要用一系列的 if
figure = ('亚索','锐雯','盲僧') if "亚索" in figure: print("亚索是中单") if "锐雯" in figure: print("锐雯是上单") if "盲僧" in figure: print("盲僧是打野")
单独的代码块如果使用 if-elif 结构,那么满足第一个条件就跳出
figure = ('亚索','锐雯','盲僧') if "亚索" in figure: print("亚索是中单") elif "锐雯" in figure: print("锐雯是上单") elif "盲僧" in figure: print("盲僧是打野")
如果是在 for 循环中使用 if-elif-else 可以,都使用 if 也可以
figure = ('亚索','锐雯','盲僧') for item in figure: if item == '亚索': print(item+"是中单") elif item == '锐雯': print(item+"是上单") else: print(item+"是打野")
5、检查特殊元素
figure = ('亚索','锐雯','盲僧') for item in figure: if item == '亚索': print(item+" this hero was select") else: print("you select hero is "+item)
6、确定列表不是空的
在运行 for 循环前确定列表是否为空。
figure = [] if figure: for figure in figure: print("use "+figure) print("begin game") else: print("don't select a hero")
在 if 语句中将列表名用在条件表达式中时,Python 将在列表至少包含一个元素时返回 True,并在列表为空时返回 False,如果列表不为空,就运行与前一个示例相同的 for 循环。
figure = ['亚索','锐雯'] if figure: for figure in figure: print("use "+figure) print("begin game") else: print("don't select a hero")
使用多个列表
figure = ['盖伦','锐雯','亚索','泰隆','剑姬'] user_figure = ['盖伦','拉克丝','锐雯'] for user_figure in user_figure: #user_figure 列表自己遍历自己的元素 if user_figure in figure: #每遍历一个元素判断是否在 figure 列表中 print('The user select hero is '+user_figure) else: print("Sorry,The user can't select "+user_figure)
五、字典
字典可存储的信息量几乎不受限制。
1、一个简单的字典
alien = {'color':'green','points':5} print(alien['color']) print(alien['points'])
2、使用字典
在Python中,字典是一系列的键值对,每个键都与一个值相关联,可以使用键来访问与之关联的值。与键相关联的值可以是数字、字符串、列表乃至字典。事实上,可将任何 Python 对象用作字典中的值。
在Python中,字典用放在花括号 { } 中的一系列键值对表示。
键值对是两个相关联的值,指定键时,Python将返回与之相关联的值。键和值之间用冒号分割,而键值对之间用逗号分割,在字典中,想存储多少个键值对都可以。
alien = {'color':'green','points':5}
要获取与键相关联的值,可依次指定字典名和放在方括号内的键
alien = {'color':'green'} print(alien['color'])
alien = {'color':'green','points':5} new_alien = alien['points'] print("You just earned "+str(new_alien)+" points")
3、添加键值对
字典是一种动态结构,可随时在其中添加键值对。要添加键值对,可依次指定字典名、用方括号括起来的键和相关联的值。
①添加键值对
fruit = {'apple':'red','banana':'yellow'} fruit['peach'] = 'pink' print(fruit)
②创建空字典在添加键值对
fruit = {} fruit['apple'] = 'red' print(fruit)
③修改字典中的值
修改字典中的值,依次指定字典名、用方括号括起来的键以及与该键相关联的新值。
fruit = {'apple':'red'} print("The apple color is "+fruit['apple']) fruit['apple'] = 'green' print("now,The apple color is "+fruit['apple'])
number = {'a':1,'b':2,'c':3} if number['a'] == 1: x = 1 elif number['a'] == 2: x = 2 else: x = 3 number['a'] = x + number['a'] print("the number a is "+str(number['a']))
4、删除键值对
对于字典中不需要的信息,可使用 del 语句将相应的键值对彻底删除。使用 del 语句时,必须指定字典名和要删除的键
fruit = {'apple': 'red', 'banana': 'yellow', 'peach': 'pink'} print(fruit) del fruit['peach'] print(fruit)
5、由类似对象组成的字典
可以使用字典来存储众多对象的同一信息。对于较长的字典,可采用如下方法
fruit = {'apple': 'red', 'banana': 'yellow', 'peach': 'pink', 'orange':'orange', 'kiwi':'green' } print("the apple color is "+fruit['apple'].title())
6、遍历字典:
#使用 items() 方法将返回一个键值对列表。
fruit = {'apple':'red','banana':'yellow','peach':'pink'} for key,value in fruit.items(): print("key: "+key) print("value: "+value+"\n")
①遍历字典中的所有键 -- keys()
fruit = {'apple':'red','banana':'yellow','peach':'pink'} for key in fruit.keys(): print("The key is "+key)
②按顺序遍历字典中的所有键
fruit = {'apple':'red','banana':'yellow','peach':'pink','pear':'yellow'} for item in sorted(fruit.keys()): print(item)
字典总是明确的记录键和值之间的关联关系,但获取字典元素时,获取顺序是不可预测的,如果按顺序输出,使用函数 sorted() 来获得按特定顺序排列列表的副本。
③遍历字典中的所有值 -- values(),返回一个值列表,不包含任何键
fruit = { 'apple':'red', 'banana':'yellow', 'peach':'pink', 'pear':'yellow' } for item in fruit.values(): print(item)
④去除重复项 -- set()
fruit = { 'apple':'red', 'banana':'yellow', 'peach':'pink', 'pear':'yellow' } for item in set(fruit.values()): print(item)
7、嵌套
将一系列字典存储在列表中,或将列表作为值存储在字典中,称为嵌套。可以在列表中嵌套字典、在字典中嵌套列表或在字典中嵌套字典。
①在列表中嵌套字典
fruit_1 = {'apple':'red'} fruit_2 = {'banana':'yellow'} fruit_3 = {'peach':'pink'} fruit_4 = {'pear':'yellow'} fruit = [fruit_1,fruit_2,fruit_3,fruit_4] print(fruit) for item in fruit: print(item)
②在字典中嵌套列表
fruit = { 'orange':'orange', 'apple':['red','green'] } print("The fruit orange's color is "+fruit['orange']+"\n") for item in fruit['apple']: print("The fruit apple's color is "+item)
③在字典中存储字典
#将每位用户的信息存储在一个字典中,对于每位用户,存储其三项信息:名、姓和居住地,遍历所有用户名,并访问每个用户相关联的信息字典。 users = { 'W':{ 'first':'wang', 'last':'_A' }, 'L':{ 'first':'li', 'last':'_B' } } for username,user_info in users.items(): print("\nUsername: "+username) full_name = user_info['first']+user_info['last'] print("Full_name:"+full_name.title())
#字典存储列表
favorite_places = {'zhangsan':['beijing','shanghai'],'lisi':['hunan','guangzhou','xizang'],'wangwu':['guizhou','neimeng']} for name,place in favorite_places.items(): print("\n"+name+"喜欢去的地方是:") for item in place: print(item.title())
# 创建一个名为cities 的字典,其中将三个城市名用作键;对于每座城市,都创建一个字典,并在其中包含该城市所属的国家、人口约数以及一个有关该 城市的事实。在表示每座城市的字典中,
应包含country 、population 和fact 等键。将每座城市的名字以及有关它们的信息都打印出来。 cities = { 'China':{ 'country':'beijing', 'population':'2153.6 million', 'fact':'capital' }, 'USA':{ 'country':'New York', 'population':'870 million', 'fact':'sports' }, 'Japan':{ 'country':'Tokyo', 'population':'1394 million', 'fact':'hot' } } for country,info in cities.items(): print("Select city is "+country) print("The city's country is "+info['country']) print("The city's population is "+info['population']) print("The city's fact is "+info['fact']+"\n")
六、用户输入和while循环
函数 input() 可以接收用户输入的内容。
①函数 Input() 的工作原理
函数 Input() 让程序暂停运行,等待用户输入一些文本,获取用户输入后,Python将其存储在一个变量中,方便之后使用。
message = input("please input a tel number:") print(message)
每当使用 input() 函数时,都应该指定清晰而易于明白的提示,有时候提示超过一行,可将提示存储在一个变量中,再将变量传递给函数 input() 。
message = "This is a long message." message += "\nplease input your number" tel = input(message) print(tel)
使用函数 input() 时,Python 将用户输入解读为字符串
age = input("please input your age:") age
当进行数字比较时,此时会报错,因为无法将字符串和数字进行比较。
函数 int() 将Python的输入视为数值,
age = input("please input your age:") age = int(age) if age < 30: print("your are so young")
或
age = int(input("please input your age:"))
if age < 30:
print("your are so young")
1、求模运算符
求模运算符将两个数相除并返回余数,不会指出一个数是另一个数的多少倍,而指出余数是多少。
number = int(input("please input a number: ")) if number % 2 == 0 : print("The number "+str(number)+" is even") else: print("The number "+str(number)+" is odd")
#判断一个数是不是100的整数 number = input("please input a number: ") number = int(number) if number % 100 == 0: print("This "+str(number)+" is an integer multiple of 100") else: print("This "+str(number)+" is not an integer multiple of 100")
2、while循环简介
for 循环用于针对集合中的每个元素的一个代码块,而 while 循环不断的运行,直到指定的条件不满足为止。
#使用循环来数数 number = 1 while number <= 5: print(number) number += 1
message_a = input("please input a str: ") while message_a != 'quit': message_a = input("please input a str: ") if message_a == 'quit': print("over") else: print("continue")
#添加一个标志,将这个标志命名为 active,可以将标志命名为任何名称。用于判断程序是否应该继续执行。
active = True while active: message_a = input("please input a str: ") if message_a == 'quit': active = False else: print("continue")
将程序变量 active 设置为 True,让程序处于活动状态,这样简化了while语句,不需要做任何比较,将变量 active 变为 True,循环将继续执行。将变量 active 设置为 False,这将导致 while 循环不再执行。
1、使用 break 退出循环
要立即退出 while 循环,不再运行循环中余下的代码,也不管条件测试的结果如何,可使用 break 语句,break 语句用于控制程序流程,可使用它来控制哪些代码行执行,哪些代码行不执行。
city = "Please enter according to the prompt," city += "\nPlease input a city name:" while True: message = input(city) if message == 'quit': break else: print("I love city is "+message+"\n")
在任何Python循环中都可使用break语句,可使用break语句来退出遍历列表或字典的for循环。
2、在循环中使用continue
要返回到循环开头,并根据条件测试结果决定是否继续执行循环,可使用continue语句,它不像break语句那样不再执行余下的代码并退出整个循环。
number = 0 while number < 10: number += 1 if number % 2 == 0: continue print(number)
message = "please input a fruit: " while True: fruit = input(message) if fruit == 'quit': break else: print("I Like eat fruit is "+fruit+"\n")
3、使用 while 循环来处理列表和字典
for 循环是一种遍历列表的有效方式,但在 for 循环中不应修改列表,否则将导致 Python 难以跟踪其中的元素。要在遍历列表的同时对其进行修改,可使用 while 循环,通过将 while 循环同列表和字典结合使用,可收集、存储并组织大量输入,供以后查看和显示。
在列表之间移动元素
fruit = ['apple','banana','peach'] fruit_new = [] while fruit: fruit_A = fruit.pop() print("I like this fruit: "+fruit_A) fruit_new.append(fruit_A) for item in fruit_new: print(item.title())
①删除包含特定值的所有列表元素
pets = ['cat','dog','rabbit','cat','pig','cat'] print(pets) while 'cat' in pets: pets.remove("cat") print(pets)
②使用用户输入来填充字典
question = {} active = True while active: name = input("What's your name: ") ques = input("How do you like fruit: ") question[name] = ques resp = input("Have another person?(yes/no): ") if resp == 'yes': continue elif resp == 'no': active = False print("\nOver") else: print("please input right option") continue for name,ques in question.items(): print(name.title()+" like fruit is "+ques.title())
七、函数
函数是带名字的代码块,用于完成具体的工作。
要执行函数定义的特定任务,可调用该函数,需要在程序中多次执行同一项任务时,无需反复编写该任务的代码,只需要调用执行该任务的函数。
定义函数,使用 def 定义函数
def number(): '''定义一个简单的函数''' print("Hello World") number()
函数i调用让Python执行函数的代码,要调用函数,可依次指定函数名以及用括号括起的必要信息。
1、向函数传递信息
def greet_user(username): print("Hello, "+username.title() + "!") greet_user('Jerry')
在函数定义 greet_user() 的括号内添加 username ,通过在这里添加 username ,就可让函数接受你给 username 的任何值,函数调用时给 username 指定一个值,调用 greet_user() 时,可将一个名字传递给它。
2、实参和形参
在函数 greet_user() 的定义中,变量 username 是一个形参,形参是函数完成其工作所需的一项信息,在代码 greet_user('Jerry') 中,值 'Jerry' 是一个实参,实参是调用函数时传递给函数的信息。
我们调用函数时,将要让函数使用的信息放在括号内,在greet_user('Jerry')中,将实参‘Jerry’ 传递给了函数 greet_user(),这个值被存储在形参 username 中。
3、传递实参
函数定义中可能包含多个形参,因此函数调用中也可能包含多个实参。向函数传递实参的方式很多,可使用位置实参,这要求实参的顺序与形参的顺序相同,也可使用关键字实参,其中每个实参都由变量名和值组成,还可使用列表和字典。
①位置实参
Python必须将函数调用中的每个实参都关联到函数定义中的一个形参,最简单的关联方式是基于实参的顺序,这种关联方式被称为位置实参。
def fruit(fruit_name,fruit_color): print("I like fruit name is "+fruit_name+",and It's color is "+fruit_color) fruit('apple','green')
②可以调用函数多次
def fruit(fruit_name,fruit_color): print("I like fruit name is "+fruit_name+",and It's color is "+fruit_color) fruit('apple','green') fruit('peach','pink')
在函数中,根据需要使用任意数量的位置实参,Python将按顺序将函数调用中的实参关联到函数定义中相应的形参。
4、关键字实参
关键字实参是传递给函数的名称---值对,直接在实参中将名称和值关联起来了,因此向函数传递实参时不会混淆,关键字实参无需考虑函数调用中的实参顺序,清楚的指出了函数调用中各个值的用途。
def fruit(fruit_name,fruit_color): print("I like fruit name is "+fruit_name+",and It's color is "+fruit_color) fruit(fruit_name='apple',fruit_color='green') fruit(fruit_color='pink',fruit_name='peach')
5、默认值
编写函数时,可给每个形参指定默认值,在调用函数中给形参提供了实参时,Python将使用指定的实参值,否则,将使用形参的默认值,给形参指定默认值后,可在函数调用中省略相应的实参。
def fruit(fruit_name,fruit_color='red'): print("I Like fruit is "+fruit_name+",It's color is "+fruit_color) fruit(fruit_name='apple') fruit(fruit_name='banana',fruit_color='yellow') fruit('orange')
6、返回值
函数并非总是直接显示输出,相反,它可以处理一些数据,并返回一个或一组值。函数返回的值被称为返回值。
在函数中,可使用 return 语句将值返回到调用函数的代码行,返回值能够将程序的大部分繁重工作移到函数中去完成,从而简化主程序。
def fruit(fruit_name,fruit_color): full_name = fruit_name+' '+fruit_color return full_name.title() message = fruit('apple','color') print(message)
调用返回值的函数时,需要提供一个变量,用于存储返回的值,才能整洁输出,不提供变量返回的将是带引号的
①让实参变成可选的
有时候需要让实参变成可选的,这样使用函数的人只需在必要时才能提供额外的信息,可使用默认值让实参变成可选的。
def get_formatted_name(first_name,last_name,middle_name=''): if middle_name: #判断middle_name 是否有值,有的人没有中间名 full_name = first_name+'-'+middle_name+'-'+last_name return full_name.title() else: full_name = first_name+'-'+last_name return full_name.title() message = get_formatted_name('Stephen','Curry','Waddell') print(message) message = get_formatted_name('LeBron','James') print(message)
②返回字典
函数可返回任何类型的值,包括列表和字典等较复杂的数据结构。
def fruit(fruit_name,fruit_color): fruit_full = {'name':fruit_name,'color':fruit_color} return fruit_full message = fruit('apple','red') print(message)
def name(first_name,last_name,age=''): person = {'first':first_name,'last':'last_name'} if age: person['age'] = age return person message = name('Wang','_A') print(message) message = name('L','_B',age=24) print(message)
7、结合使用函数和while循环
def fruit(fruit_name,fruit_color): fruit_full_name = fruit_name+'-'+fruit_color return fruit_full_name.title() while True: print("\n请输入你喜欢的水果的名称和颜色") f1 = input("Fruit's name: ") l1 = input("Fruit's color: ") message = fruit(f1,l1) print("I Like fruit is "+message)
def fruit(fruit_name,fruit_color): fruit_full_name = fruit_name+'-'+fruit_color return fruit_full_name.title() while True: print("\n请输入你喜欢的水果的名称和颜色") f1 = input("Fruit's name: ") l1 = input("Fruit's color: ") if f1 == 'q' and l1 == 'q': break message = fruit(f1,l1) print("I Like fruit is "+message)
def fruit(fruit_name,fruit_color): full_fruit = {fruit_name:fruit_color} return full_fruit while True: fruit_n = input("please input fruit's name: ") fruit_c = input("please input fruit's color: ") if fruit_n == 'quit' and fruit_c == 'quit': break message = fruit(fruit_n,fruit_c) for name,color in message.items(): print(name+"'s color is"+color)
#可选形参 def fruit(fruit_name,fruit_color,fruit_count=''): fruit_full = {'fruit_name':fruit_name,'fruit_color':fruit_color} if fruit_count: fruit_full['fruit_count'] = fruit_count return fruit_full while True: fruit_n = input("input fruit's name: ") if fruit_n == 'quit': break fruit_c = input("input fruit's color: ") if fruit_c == 'quit': break fruit_co = input("input fruit's count: ") if fruit_co == 'quit': break message = fruit(fruit_n,fruit_c,fruit_co) print(message)
8、传递列表
向函数传递列表,列表包含的可能是名字、数字或更复杂的对象(如字典),将列表传递给函数后,函数就能直接访问其内容。
def greet_users(names): for name in names: print("Hello,"+name.title()+"!") username = ['Tom','Jerry','Hardon'] greet_users(username)
①在函数中修改列表
列表传递给函数后,函数可对其进行修改,在函数中对这个列表所作的任何修改都是永久性的,能够高效的处理大量数据。
def fruit(fruit_name,fruit_full): while fruit_name: fruit_a = fruit_name.pop() print("弹出的元素是:"+fruit_a) fruit_full.append(fruit_a) def fruit_new(fruit_full): for item in fruit_full: print("元素:"+item) fruit_name = ['apple','banana','pear','orange'] fruit_full = [] fruit(fruit_name,fruit_full) fruit_new(fruit_full)
②禁止函数修改列表
切片表示法[:] 可以创建副本的形式操作,而原列表不发生变化
#name是列表
修改列表:fruit(name,color)
使用副本,不修改列表:fruit(name[:],color)
9、传递任意数量的实参 -- *
预先不知道函数需要接受多少个实参,Python允许函数从调用语句中收集任意数量的实参。
def fruit(*fruit_name): print(fruit_name) fruit('apple') fruit('apple','banana','orange')
使用 * 号让形参可以接受多个参数。
def fruit(*fruit_name): for item in fruit_name: print(item) fruit('apple','banana','orange')
10、结合使用位置实参和任意数量实参
如果让函数接收不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后,Python先匹配位置关键字和关键字实参,再将余下的实参都收集到最后一个形参中。
def fruit(fruit_name,*fruit_color): print("The Fruit is "+fruit_name) for item in fruit_color: print("- " +item) fruit('orange','orange') fruit('apple','red','green','yellow')
Python将收到的第一个值存储在形参 fruit_name 中,并将其他的所有值都存储在元组 fruit_color 中。
11、使用任意数量的关键字实参
需要接受任意数量的实参,但是预先不知道传递给函数的会是什么样的信息,这种情况下,可将函数编写能够接受任意数量的键值对,调用语句提供了多少就接受多少。
def fruit(fruit_name,fruit_color,**fruit_info): profile = {} profile['fruit_name'] = fruit_name profile['fruit_color'] = fruit_color for key,value in fruit_info.items(): #遍历字典fruit_info的键值对,并将每一个键存储到字典profile中。 profile[key] = value return profile fruit_full = fruit('apple','red',location='Beijing',count=20) print(fruit_full)
12、将函数存储在模块中
函数的优点之一是,使用他们可将代码块与主程序分离,通过给函数指定描述性名称,可让主程序容易理解的多。
可以将函数存储在称为模块的独立文件中,再将模块导入到主程序中,import 语句允许再当前运行的程序文件中使用模块中的代码。
①导入整个模块
要让函数导入,需要先创建模块,模块是扩展名为 .py 的文件,包含要导入到程序中的代码,例,创建一个包含 make_pizza() 的模块,保存在 pizza.py中。
def make_pizza(size,*toppings): '''概述要制作的披萨''' print("\nMaking a "+str(size)+ "-inch pizza with the following toppings:") for topping in toppings: print("- "+ topping)
在 pizza.py 所在的目录中创建另一个名为 making_pizzas.py 的文件,这个文件导入刚刚创建的模块并进行调用。
import pizza pizza.make_pizza('12','pepperoni') pizza.make_pizza('16','mushrooms','green peppers','extra cheese')
调用 pizza.py 模块后得出的结果,在making_pizzas.py 中可以使用 pizza.py 定义的所有函数。
#使用 import 就可以导入函数,导入后的使用方法
module_name.function_name()
②导入特定的函数
from module_name import function_name
通过用逗号分割函数名,可根据需要从模块中导入任意数量的函数
from module_name import function_0,function_1.function_2
对于前面的making_pizza.py 示例,如果只想导入想要的函数,可以使用类似下面
from pizza import make_pizza
③使用as给函数指定别名
如果导入的函数名称与程序现有的名称冲突,或者函数的名称太长,可指定简短而独一无二的别名 -- 函数的另一个名称。
from pizza import make_pizza as mp mp(16,'pepperoni') mp(12,'mushrooms','green peppers','extra cheese')
④使用as给模块指定别名
import pizza as p p.make_pizza(16,'pepperoni') p.make_pizza(12,'mushrooms','green peppers','extra cheese')
⑤导入模块中的所有函数
使用星号(*)运算符可让Python导入模块中的所有函数
from pizza import * make_pizza(16,'pepperoni') make_pizza(12,'mushrooms','green peppers','extra cheese')
八、类
首字母大写的名称指的是类。
在面向对象编程中,表示显示世界中的事物和情景的类,并基于这些类来创建对象,编写类时,定义一大类对象都有的通用行为。
基于类创建对象时,每个对象都自动具备这种通用行为,然后可根据需要赋予每个对象独特的个性。
根据类来创建对象被称为实例化,能够用类的实例。
1、创建和使用类
例:编写一个表示小狗的简单类Dog,不是特定的小狗,而是任何小狗,大多数小狗都有名字和年龄,还会蹲下和打滚。由于大多数小狗都具备上述两项信息和两种行为,这个类让Python知道如何创建小狗的对象,编写这个类后再使用它来创建表示特定小狗的实例。
#创建Dog类 #根据Dog类的每个实例都将存储名字和年龄,赋予每条小狗蹲下(sit()) 和 打滚 (roll_over()) 的能力 class Dog(): '''一次模拟小狗的简单尝试''' def __init__(self,name,age): '''初始化属性name和age''' self.name = name self.age = age def sit(self): '''模拟小狗被命令时蹲下''' print(self.name.title()+" is now sitting.") def roll_over(self): '''模拟小狗被命令时打滚''' print(self.name.title()+" rolled over!")
①方法 __init__()
前面学到的有关函数的一切都适用于方法。__init__() 是一个特殊的方法,每当根据Dog()类创建实例时,Python都会自动运行它,在这个方法的名称中,开头和末尾各有两个下划线,避免Python默认方法与前面普通方法发生名称冲突。
上面Dog()例子中,将方法__init__() 定义成了包含三个形参:self、name、age,在这个方法的定义中,形参 self 必不可少,还必须位于其他形参的前面,Python 调用这个 __init__() 方法来创建 Dog 实例时将自动传入实参 self。每个类相关联的方法调用都自动传递实参 self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
Python 调用Dog类的方法 __init__(),通过实参向 Dog() 传递名字和年龄;self 会自动传递,因此不需要传递它,每当根据Dog类创建实例时,都只需给最后两个形参(name 和 age)提供值。
以self为前缀的变量都可供类中的所有方法使用,还可以通过类的任何实例来访问这些变量。self.name = name 获取存储在形参 name 中的值,并将其存储到变量中,然后该变量被关联到当前创建的实例。
Dog 类定义的另外两个方法,sit() 和 roll_over() ,这些方法不需要额外的信息,如名字或年龄,因此它们只有一个形参self。
class Dog(): '''一次模拟小狗的简单尝试''' def __init__(self,name,age): '''初始化属性name和age''' self.name = name self.age = age def sit(self): '''模拟小狗被命令时蹲下''' print(self.name.title()+" is now sitting.") def roll_over(self): '''模拟小狗被命令时打滚''' print(self.name.title()+" rolled over!") my_dog = Dog('naonao',6) print("My Dog's name is "+my_dog.name+" ,and it's age is "+str(my_dog.age)) #my_dog.name 访问小狗名字
②访问属性
要访问实例的属性,可使用句点表示法:如 my_dog.name、my_dog.age
③调用方法
根据 Dog 类创建实例后,就可以使用句点表示法调用 Dog 类中定义的任何方法
class Dog(): '''一次模拟小狗的简单尝试''' def __init__(self,name,age): '''初始化属性name和age''' self.name = name self.age = age def sit(self): '''模拟小狗被命令时蹲下''' print(self.name.title()+" is now sitting.") def roll_over(self): '''模拟小狗被命令时打滚''' print(self.name.title()+" rolled over!") my_dog = Dog('naonao',6) my_dog.sit() my_dog.roll_over()
④创建多个实例
class Dog(): '''一次模拟小狗的简单尝试''' def __init__(self,name,age): '''初始化属性name和age''' self.name = name self.age = age def sit(self): '''模拟小狗被命令时蹲下''' print(self.name.title()+" is now sitting.") def roll_over(self): '''模拟小狗被命令时打滚''' print(self.name.title()+" rolled over!") my_dog = Dog('naonao',6) my_dog.sit() your_dog = Dog('niuniu','8') your_dog.roll_over() print("My Dog's name is "+my_dog.name+",and it's age is "+str(my_dog.age)) print("My Dog's name is "+your_dog.name+",and it's age is "+str(your_dog.age))
#创建一个名为Restaurant 的类,其方法__init__() 设置两个属性:restaurant_name 和cuisine_type 。创建一个名 为describe_restaurant() 的方法和一个名为open_restaurant() 的方法,其中前者打印前述两项信息,而后者打印一条消息,指出餐馆正在营业。 根据这个类创建一个名为restaurant 的实例,分别打印其两个属性,再调用前述两个方法 class Restaurant(): def __init__(self,restaurant_name,cuisine_type): self.restaurant_name = restaurant_name self.cuisine_type = cuisine_type def describe_restaurant(self): print("restaurant name is "+self.restaurant_name+",cusine type is "+self.cuisine_type) def open_restaurant(self): print("餐馆正常营业") restaurant = Restaurant('python','⭐⭐⭐⭐⭐') print("Look! "+restaurant.restaurant_name+",and it;s type is "+restaurant.cuisine_type) restaurant.describe_restaurant() restaurant.open_restaurant()
class User(): def __init__(self,first_name,last_name,*info): #info 传入多个信息 self.fn = first_name self.ln = last_name self.info = info def describe_user(self): print("first name is "+self.fn+",last name is "+self.ln) print("Like sports:") for item in self.info: #遍历info print(item) def greet_user(self): print("Hello,"+self.fn+"-"+self.ln) user = User('Lebron','James','basketball','swimming') user.describe_user() user.greet_user()
2、使用类和实例
可以使用类来模拟世界中的很多情景,类编写好后,大部分时间都将花在使用根据类创建的实例上,需要执行的一个重要任务是修改实例的属性,可以直接修改实例的属性,也可以编写方法以特定的方式进行修改
class Car(): def __init__(self,make,model,year): '''初始化描述汽车的属性''' self.make = make self.model = model self.year = year def get_descriptive_name(self): '''返回整洁的信息''' long_name = str(self.year)+' '+self.make+' '+self.model return long_name.title() my_new_car = Car('audi','a4',2021) print(my_new_car.get_descriptive_name())
①给属性指定默认值
类中的每个属性都必须有初始值,哪怕这个值是0或空字符串。
添加一个名为 odometer_reading 的属性,其初始值总是为0 ,再添加一个名为 read_odometer() 的方法,用于读取汽车的里程表。
class Car(): def __init__(self,make,model,year): '''初始化描述汽车的属性''' self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): '''返回整洁的信息''' long_name = str(self.year)+' '+self.make+' '+self.model return long_name.title() def read_odometer(self): '''打印一条汽车里程的信息''' print("This car has "+str(self.odometer_reading)+" miles on it.") my_new_car = Car('audi','a4',2021) print(my_new_car.get_descriptive_name()) my_new_car.read_odometer()
可以以三种方法修改属性的值:直接通过实例进行修改、通过方法进行修改、通过方法进行递增(增加特定的值)
①直接修改属性的值
class Car(): def __init__(self,make,model,year): '''初始化描述汽车的属性''' self.make = make self.model = model self.year = year self.odometer_reading = 0 #添加的属性 odometer_reading 初始值为0 def get_descriptive_name(self): '''返回整洁的信息''' long_name = str(self.year)+' '+self.make+' '+self.model return long_name.title() def read_odometer(self): '''打印一条汽车里程的信息''' print("This car has "+str(self.odometer_reading)+" miles on it.") my_new_car = Car('audi','a4',2021) print(my_new_car.get_descriptive_name()) my_new_car.read_odometer() my_new_car.odometer_reading = 23 #直接修改属性 odometer_reading 的值为23 my_new_car.read_odometer()
②通过方法修改属性的值
class Car(): def __init__(self,make,model,year): '''初始化描述汽车的属性''' self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): '''返回整洁的信息''' long_name = str(self.year)+' '+self.make+' '+self.model return long_name.title() def read_odometer(self): '''打印一条汽车里程的信息''' print("This car has "+str(self.odometer_reading)+" miles on it.") def update_data(self,data): #定义一个用来修改属性值得方法 self.odometer_reading = data #将传入的参数的值存储到 odometer_reading 中 my_new_car = Car('audi','a4',2021) print(my_new_car.get_descriptive_name()) my_new_car.read_odometer() my_new_car.update_data(23) #向方法update_data传递参数 my_new_car.read_odometer()
可以添加逻辑禁止将里程表读数回调
class Car(): def __init__(self,make,model,year): '''初始化描述汽车的属性''' self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): '''返回整洁的信息''' long_name = str(self.year)+' '+self.make+' '+self.model return long_name.title() def read_odometer(self): '''打印一条汽车里程的信息''' print("This car has "+str(self.odometer_reading)+" miles on it.") def update_data(self,data): if data >= self.odometer_reading: #判断修改的里程是否大于定义的里程值 self.odometer_reading = data else: print("You can't roll back an odometer!") my_new_car = Car('audi','a4',2021) print(my_new_car.get_descriptive_name()) my_new_car.read_odometer() my_new_car.update_data(-1) #将里程的值变为 -1 my_new_car.read_odometer()
③通过方法对属性的值进行递增
有时候需要将属性值递增特定特定的量,而不是将其设置为全新的值。假设购买了一辆二手车,且从购买到登记期间增加了100英里的里程。
class Car(): def __init__(self,make,model,year): '''初始化描述汽车的属性''' self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): '''返回整洁的信息''' long_name = str(self.year)+' '+self.make+' '+self.model return long_name.title() def read_odometer(self): '''打印一条汽车里程的信息''' print("This car has "+str(self.odometer_reading)+" miles on it.") def update_odometer(self,mileage): self.odometer_reading = mileage def increment_odometer(self,miles): self.odometer_reading += miles my_used_car = Car('subaru','outback',2013) print(my_used_car.get_descriptive_name()) my_used_car.update_odometer(23500) my_used_car.read_odometer() my_used_car.increment_odometer(23600) my_used_car.read_odometer()
#User 类中,添加一个名为login_attempts 的属性。编写一个名为increment_login_attempts() 的方法, 它将属性login_attempts 的值加1。再编写一个名为reset_login_attempts() 的方法,它将属性login_attempts 的值重置为0。 根据User 类创建一个实例,再调用方法increment_login_attempts() 多次。打印属性login_attempts 的值,确认它被正确地递增;然后,调用方 法reset_login_attempts() ,并再次打印属性login_attempts 的值,确认它被重置为0。 class User(): def __init__(self,first_name,last_name,*info): self.fn = first_name self.ln = last_name self.info = info self.login_attempts = 20 def describe_user(self): print("first name is "+self.fn+",last name is "+self.ln) print("Like sports:") for item in self.info: print(item) def greet_user(self): print("Hello,"+self.fn+"-"+self.ln) print("Now Login users are: "+str(user.login_attempts)) def increment_login_attempts(self,login_number): self.login_attempts += login_number #递增将属性login_attempts的值加1 def reset_login_attempts(self): self.login_attempts = 0 #重置login_attempts的值为0 user = User('Lebron','James','basketball','swimming') user.describe_user() user.greet_user() user.increment_login_attempts(10) #验证login_attempts的值是递增的 user.greet_user() user.increment_login_attempts(20) #验证login_attempts的值是递增的 user.greet_user() user.reset_login_attempts() #重置login_attempts的值为0 user.greet_user()
3、继承
编写类时,并非总是要从空白开始,如果编写的类是另一个现成类的特殊版本,可使用继承,一个类继承另一个类时,将自动获得另一个类的所有属性和方法
原有的类称为父类,而新类称为子类,子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。
①子类的方法 __init__()
创建子类的实例时,Python首先需要完成的任务是父类的所有属性赋值,为此,子类的 __init__()需要父类施以援手。
例:模拟电动汽车,电动汽车是一种特殊的汽车,可以在前面的Car类的基础上创建新类ElectricCar,这样我们就只需为电动汽车特有的属性和行为编写代码。
class Car(): #创建子类时,父类必须包含在当前文件中,且位于子类前面 def __init__(self,make,model,year): '''初始化描述汽车的属性''' self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): '''返回整洁的信息''' long_name = str(self.year)+' '+self.make+' '+self.model return long_name.title() def read_odometer(self): '''打印一条汽车里程的信息''' print("This car has "+str(self.odometer_reading)+" miles on it.") def update_data(self,mileage): if mileage >= self.odometer_reading: self.odometer_reading = mileage else: print("You can't roll back an odometer!") class ElectricCar(Car): #定义子类 ElectricCar,定义子类时,必须在括号内指定父类的名称 """电动汽车的独特之处""" def __init__(self,make,model,year): #方法 __init__()接受创建 Car 实例所需的信息 """初始化父类的属性""" super().__init__(make,model,year) #super()是一个特殊函数,帮助Python将父类和子类关联起来,让Python调用ElectricCar的父类方法__init__(),让ElectricCar实例包含父类的所有属性 #父类也称为超类,名称 super 因此而得名
my_tesla = ElectricCar('tesla','model s',2016) print(my_tesla.get_descriptive_name())
②重写父类的方法
对于父类的方法,只要不符合子类模拟的实物的行为,都可对其进行重写,可在子类中定义一个与要重写的父类方法同名,这样 Python 将不会考虑这个父类方法,只关注在子类中定义的相应方法。
#Car 类有一个名为fill_gas_tank() 的方法,它对全电动汽车来说毫无意义,因此想重写它。 class Car(): def __init__(self,make,model,year): '''初始化描述汽车的属性''' self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): '''返回整洁的信息''' long_name = str(self.year)+' '+self.make+' '+self.model return long_name.title() def read_odometer(self): '''打印一条汽车里程的信息''' print("This car has "+str(self.odometer_reading)+" miles on it.") def fill_gas_tank(self): #父类中fill_gas_tank() 方法输出"汽车使用汽油" print("汽车使用汽油") class ElectricCar(Car): """电动汽车的独特之处""" def __init__(self,make,model,year): """初始化父类的属性""" super().__init__(make,model,year) def fill_gas_tank(self): #子类中重写 fill_gas_tank()方法,与父类方法同名,之后只调用子类的方法 print("电动车用电") my_tesla = ElectricCar('tesla','model s',2016) print(my_tesla.get_descriptive_name()) my_tesla.fill_gas_tank()
③将实例用作属性
使用代码模拟实物时,可能会发现自己给类添加的细节越累越多,属性和方法清单以及文件都越来越长,这种情况下需要将类的一部分作为一个独立的类提取出来,可以将大型类拆分成多个协同工作的小类。
class Car(): def __init__(self,make,model,year): self.make = make self.model = model self.year = year def get_descriptive_name(self): '''返回整洁的信息''' long_time = str(self.year)+' '+self.make+' '+self.model return long_time class Battery(): #新定义的Battery新类,没有继承任何类 def __init__(self,battery_size=70): #方法 __init__() 除self外,还有另一个形参battery_size,这个形参时可选的,如果没有给它提供值,电瓶容量被设置为70. self.battery_size = battery_size def describe_battery(self): '''打印一条描述电瓶的信息''' print("This car has a "+str(self.battery_size)+"-kwh battery.") class ElectricCar(Car): def __init__(self,make,model,year): """初始化父类的属性,再初始化电动汽车特有的属性""" super().__init__(make,model,year) self.battery = Battery() #添加一个名为 self.battery的属性,让Python创建一个新的Battery实例(默认值70),并将该实例存储再属性self.battery中 #每当方法__init__()被调用时,都将执行该操作,因此现在每个ElectricCar实例都包含一个自动创建的Battery实例 my_tesla = ElectricCar('tesla','models',2016) print(my_tesla.get_descriptive_name()) my_tesla.battery.describe_battery() #需要使用电动汽车的属性 battery描述电瓶,这行代码让Python在实例my_tesla中查找属性battery,并对存储在该属性中的Battery实例调用方法describe_battery()
4、导入类
随着不断给类添加功能,文件可能变得很长,为遵循Python的总体概念,应让文件尽可能简洁,Python允许将类存储再模块中,然后在主程序中导入所需的模块。
import module_name from class_name
例:从Car模块中导入my_Car
from Car import my_Car
my_new_car = my_Car('audi','a4',2016)
print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
①在一个模块中存储多个类
#Battery.py,定义函数 class Car(): def __init__(self,make,model,year): self.make = make self.model = model self.year = year def get_descriptive_name(self): '''返回整洁的信息''' long_time = str(self.year)+' '+self.make+' '+self.model return long_time class Battery(): def __init__(self,battery_size=70): self.battery_size = battery_size def describe_battery(self): '''打印一条描述电瓶的信息''' print("This car has a "+str(self.battery_size)+"-kwh battery.") def get_range(self): if self.battery_size == 70: range = 240 elif self.battery_size == 85: range = 270 print("Hello,This car has a " + str(self.battery_size) + "-kwh battery"+",and "+str(range)+" km !") class ElectricCar(Car): def __init__(self,make,model,year): """初始化父类的属性,再初始化电动汽车特有的属性""" super().__init__(make,model,year) self.battery = Battery()
②导入一个类进行调用
from Battery import ElectricCar my_tesla = ElectricCar('tesla','models',2016) print(my_tesla.get_descriptive_name()) my_tesla.battery.describe_battery() my_tesla.battery.get_range()
③从一个模块中导入多个类
from module_name import class_name1,class_name2
例:
form Car import Car,ElectricCar
④导入整个模块
import module_name
例
import Car
⑤导入模块中的所有类
from module_name imprt *
5、在一个模块中导入另一个模块
有时候需要将类分散到多个模块中,以免模块太大,或在同一个模块中存储不相关的类,将类存储在多个模块中时,可能会发现一个模块中的类依赖于另一个模块中的类,在这种情况下可在前一个模块中导入必要的类。
例:Car、ElectricCar类和Battery类分别存储在一个模块,ElectricCar类和Battery类依赖Car类,将后两者的文件复制到 Car类存在的文件 from car import Car class Battery(): --snip-- class ElectricCar(Car): --snip--