《零基础入门学习python》学习过程(三)

时间:2023-02-08 19:58:54

学习时间:2017/09/16

第八、九、十课:了不起的分支和循环

知识点汇总:
1. 飞机游戏整体框架:

加载背景音乐
播放背景音乐(设置单曲循环)
我方飞机诞生
interval = 0 #间隔时间
while True:
if 用户是否点击了关闭按钮:
退出程序
break

interval += 1
if interval == 50
interval = 0
小飞机诞生
小飞机移动一个位置
屏幕刷新

if 用户鼠标产生移动:
我方飞机中心位置 = 用户鼠标位置
屏幕刷新
if 我方飞机与小飞机发生位置冲突:
我方挂,播放撞击音乐
修改我方飞机图案
打印"Game over"
停止背景音乐,最好淡出
break

2.elif =else if,python可以有效避免”悬挂else“。

3.条件表达式(三元操作符):语法为x if 条件 else y,即if条件为真,则返回if else 左边的值,否则返回右边的值。

>>> x,y=4,5
>>> small=x if x<y else y
>>> small
4

>>> x,y=4,5
>>> if x<y:
small=x
else:
samll=y

>>> small
4

4.断言(assert):当这个关键词后边的条件为假的时候,程序自动崩溃并抛出AssertionError的异常。
一般来说我们可以用它在程序中置入检查点,当需要确保程序中的某个条件一定为真才能让程序正常工作的话,assert关键字就非常有用了。

5.相对于C语言中的for循环不同,python的for循环显得更为智能和强大。语法:

for 目标 in 表达式:
循环体
>>> number=['第一个','第二','三','']
>>> for each in number:
print(each,len(each))


第一个 3
第二 2
1
0

6.成员资格符:in,用于检查一个值是否在序列中,如果在序列中返回True,否则返回False。

>>> name="小甲鱼"
>>> '鱼' in name
True
>>> '肥鱼' in name
False

当在in后使用的是一个int型变量,则程序会报错,因为in是成员资格运算符,而不是像 C 语言那样去使用 for 语法。Python 的 for 更像脚本语言的 foreach

7.range()
语法为range([start,]stop[,step=1])
- 这个BIF有三个参数,其中用中括号括起来的两个表示这两个参数可选。
- step=1表示第三个参数的值默认为1
- range这个BIF的作用是生成一个从start参数的值开始到stop参数的值(不包含该值)结束的数字序列。

>>> for i in range(1,11,2):
print(i,end=" ")


1 3 5 7 9

8.两个关键的语句:breakcontinue,break终止循环,跳出循环体;continue跳出本轮循环,开始下一轮循环(这里要注意的是:在开始下一轮循环之前,会先测试循环条件)。

9.假设有x=1y=2z=3,请问如何快速将三个变量的值互相交换?

>>> x=1;y=2;z=3
>>> x,y,z=z,x,y
>>> print(x,y,z)
3 1 2

10.什么情况下我们要使循环永远为真?

while Ture:
循环体

用于游戏实现,因为游戏只要运行着,就需要时刻接收用户输入,因此使用永远为真确保游戏“在线”。操作系统也是同样的道理,时刻待命,操作系统永远为真的这个循环叫做消息循环。另外,许多通讯服务器的客户端/服务器系统也是通过这样的原理来工作的。
所以永远为“真”虽然是“死循环”,但不一定是坏事,再说了,我们可以随时用 break 来跳出循环!

11.编写一个程序,求100~999之间的所有水仙花数(如果一个三位数等于各位数字的立方和,则称这个数为水仙花数。例如153=1^3+5^3+3^3,因此153就是一个水仙花数)

for i in range(100,1000):
sum = 0
temp = i
while temp:
sum = sum +(temp%10)**3 #加上个位数的立方
temp //= 10 #floor除法取得各位上的数字
if sum == i:
print(i)

12.三色球问题:有红、黄、绿三种颜色的球,其中红球3个,黄球3个,绿球6个,先将这12个球混合放在一个盒子中,从中任意摸出8个球,编程计算摸出球的各种颜色搭配。

print('res\yellow\green')
for red in range(0,3):
for yellow in range(0,3):
for green in range(2,7):
if(red+yellow+green==8):
# 注意,下边不是字符串拼接,因此不用“+”哦~
print(red,'\t',yellow,'\t',green)

注释:range(2, 7)是产生[2, 3, 4, 5, 6]5个数,绿球不能是1个,因为如果绿球是1个的话,红球加黄球需要有7个才能符合题意,而红球和黄球每种只有3个,因此是range(2, 7)。

第十一、十二、十三课:列表list

知识点汇总:
1.创建一个普通列表:mumber=[‘小甲鱼’,’小布丁’,’黑夜’,’迷途’]
创建一个混合列表:mix=[1,’小甲鱼’,3.14,[1,2,3]]
床架一个空列表:empty=[]
向列表添加元素:append()函数增加一个元素,extend()函数可以增加多个元素(但是是通过增加一个列表的方式),也就是说appendextend函数都只可接受一个参数。
insert()函数:在指定的位置插入元素,它有两个参数,第一个参数代表插入在列表中的位置,第二个参数为插入的元素。

>>> mumber=['小甲鱼1','小甲鱼2','小甲鱼3']
>>> mumber.append('小甲鱼4')
>>> mumber
['小甲鱼1', '小甲鱼2', '小甲鱼3', '小甲鱼4']

>>> mumber.extend (['小甲鱼5','小甲鱼6'])
>>> mumber
['小甲鱼1', '小甲鱼2', '小甲鱼3', '小甲鱼4', '小甲鱼5', '小甲鱼6']

>>> mumber.insert(0,'小甲鱼0')
>>> mumber
['小甲鱼0', '小甲鱼1', '小甲鱼2', '小甲鱼3', '小甲鱼4', '小甲鱼5', '小甲鱼6']

2.从列表中获取元素:通过元素的索引值(index)从列表中获取单个元素,注意,列表索引值是从0开始的。
从列表中删除元素:remove()函数,del语句(del listname可直接删除该列表),pop()函数(不加参数时可从列表中取出最后一个元素并返回,加元素索引值可取出该索引元素)

>>> member=['小甲鱼0', '小甲鱼1', '小甲鱼2', '小甲鱼3', '小甲鱼4', '小甲鱼5', '小甲鱼6']
>>> member.remove('小甲鱼3')
>>> member
['小甲鱼0', '小甲鱼1', '小甲鱼2', '小甲鱼4', '小甲鱼5', '小甲鱼6']

>>> del member[1]
>>> member
['小甲鱼0', '小甲鱼2', '小甲鱼4', '小甲鱼5', '小甲鱼6']

>>> member.pop()
'小甲鱼6'
>>> member
['小甲鱼0', '小甲鱼2', '小甲鱼4', '小甲鱼5']
>>> member.pop(0)
'小甲鱼0'
>>> member
['小甲鱼2', '小甲鱼4', '小甲鱼5']

3.列表分片(Slice):一次性获取多个元素,语法:listname[startnum:stopnum]从列表中获取一个从start索引值开始的元素到stop索引值结束的元素(不包含该元素)组成的新列表。原列表并不发生改变。

>>> member=['小甲鱼1', '小甲鱼2', '小甲鱼3','小甲鱼4', '小甲鱼5']
>>> member[1:3]
['小甲鱼2', '小甲鱼3']
>>> member[1:]
['小甲鱼2', '小甲鱼3', '小甲鱼4', '小甲鱼5']
>>> member[:3]
['小甲鱼1', '小甲鱼2', '小甲鱼3']
>>> member[:]
['小甲鱼1', '小甲鱼2', '小甲鱼3', '小甲鱼4', '小甲鱼5']

注意:member[:]对member列表进行内容拷贝,修改列表,拷贝的内容不改变,但也仅限于列表中的元素都是基本类型。

4.列表的一些常用操作符:
比较操作符,从第一个元素开始比较,只要有一个条件为假,则返回假。

>>> list1=[123]
>>> list2=[234]
>>> list1<list2
True
>>> list1=[123,345]
>>> list2=[123,456]
>>> list1>list2
False
>>> list3=['a'] #字符串比较其ASCII码
>>> list4=['b']
>>> list3>list4
False

连接操作符,连接两边的数据类型必须相同,列表连接单个元素会报错。相当于extend()函数的作用。

>>> list5=list1+list2
>>> list5
[123, 345, 123, 456]

重复操作符

>>> list3=[123,345]
>>> list3 * 3
[123, 345, 123, 345, 123, 345]
>>> list3
[123, 345]
>>> list3 *= 3
>>> list3
[123, 345, 123, 345, 123, 345]

成员关系操作符

>>> list1=[123,['小甲鱼','牡丹'],456]
>>> 123 in list1
True
>>> '小甲鱼' not in list1
True
>>> '小甲鱼' not in list1[1]
False
>>> list1[1][1]
'牡丹'

5.列表类型的内置函数:dir(list)列举出所有列表的内置函数
count()函数:返回参数在列表中出现的次数
index()函数:返回参数在列表中的第一次出现的位置(索引值),也可加第二、第三个参数分别表示查找的起始位置和结束位置

>>> list1=[123, 345, 123, 456, 123, 345, 123, 345, 123, 345, 123, 345, 123, 456, 123, 345, 123, 345, 123, 345, 123, 345, 123, 456, 123, 345, 123, 345, 123, 345]
>>> list1.count(345)
12
>>> list1.index(345)
1
>>> list1.index(345,2,8)
5

reverse()函数:返回列表的反序结果
sort():为列表元素进行排序(默认使用归并排序)

>>> list6=[2,6,8,7,1,9,4]
>>> list6.reverse()
>>> list6
[4, 9, 1, 7, 8, 6, 2]
>>> list6.sort()
>>> list6
[1, 2, 4, 6, 7, 8, 9]
>>> list6.sort(reverse=True)
>>> list6
[9, 8, 7, 6, 4, 2, 1]

clear函数:清除列表中的所有数据。

>>> a=[1,[2],3]
>>> a.clear()
>>> a
[]

6.列表拷贝:引用是指保存的值为对象的地址。在 Python 语言中,一个变量保存的值除了基本类型(数字、字符串)保存的是值外,其它都是引用,因此对于它们的使用就需要小心一些。
引用拷贝

>>> old=[1,2,3,4,5]
>>> new=old
>>> old=[6] #和下面的对old的修改操作做区分,这里是将新的对象赋给old变量
>>> new #new对象内容不变
[1, 2, 3, 4, 5]

>>> old=[1,2,3,4,5]
>>> new=old
>>> old.append(6) #对old指向的对象进行修改操作
>>> old
[1, 2, 3, 4, 5, 6]
>>> new #new对象内容改变
[1, 2, 3, 4, 5, 6]

这种做法其实并未真正生成一个新的列表,b指向的仍然是a所指向的对象。这样,如果对ab的元素进行修改,a,b的值同时发生改变。
解决方法为

>>> a=[1,[2],3]
>>> b=a[:]
>>> b
[1, [2], 3]
>>> a.append(4)
>>> a
[1, [2, 3], 3, 4]
>>> b
[1, [2, 3], 3]

但这种方法只适用于简单列表,也就是列表中的元素都是基本类型,如果列表元素还存在列表的话,这种方法就不适用了。原因就是,像a[:]这种处理,只是将列表元素的值生成一个新的列表,如果列表元素也是一个列表,如a[1,[2]],那么这种复制对于元素[2]的处理只是复制[2]的引用,而并未生成[2]的一个新的列表复制。

>>> a=[1,[2],3]
>>> b=a[:]
>>> b
[1, [2], 3]
>>> a[1].append(3)
>>> a
[1, [2, 3], 3]
>>> b
[1, [2, 3], 3]

可见,a的修改影响到了b。为解决这个问题,可以使用copy模块中的deepcopy函数。

>>> import copy
>>> a=[1,[2],3]
>>> b=copy.deepcopy(a)
>>> b
[1, [2], 3]
>>> a[1].append(3)
>>> a
[1, [2, 3], 3]
>>> b
[1, [2], 3]

deepcopy是对a的深度拷贝,copy模块中还有copy函数,是对a的浅层拷贝,效果与a[:]相同。

>>> import copy
>>> a=[1,[2],3]
>>> b=copy.copy(a) #或b=a.copy()
>>> b
[1, [2], 3]
>>> a[1].append(3)
>>> a
[1, [2, 3], 3]
>>> b
[1, [2, 3], 3]
>>> a.append(4)
>>> a
[1, [2, 3], 3, 4]
>>> b
[1, [2, 3], 3]

7.列表推导式(列表解析List comprehensions):灵感取自函数式编程语言 Haskell。它是一个非常有用和灵活的工具,可以用来动态得创建列表,语法为
[有关A的表达式 for A in B]
例如,以下代码打印0到9各个数的平方,并放在了一个表表中

>>> list1=[i**2 for i in range(10)]
>>> list1
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

相当于

>>> list1=[]
>>> for i in range(10):
list1.append(i**2)
>>> list1
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]