个人笔记,仅供参考
五、条件、循环及其他语句
1、再谈print和import
1.1、打印多个参数
print不仅可以打印一个表达式,还可以同时打印多个表达式,条件是用逗号分隔。
>>> print('Age:',42)
Age: 42
如你所见,打印后的两个参数之间有一个空格。在你要合并文本和变量值,而又不想使用字符串设置功能时,这种行为很有用。
可以取消结尾默认的换行符,
print('Hello,',end='')
print('world')
使用上面两行代码打印Hello,world
1.2、导入时重命名
从模块导入时通常用以下几种方法
import somemodule
from somemodule import somefunction
from somemodule import function1,funtion2
导入包中所有内容时
from somemodule import *
如果导入多个包,且有同名函数,调用时应制定包名
module1.open()
module2.open()
或者在导包时添加as并制定别名
>>> from math import sqrt as foobar
>>> foobar(4)
2.0
2、赋值
(花里胡哨的赋值,了解就好)
2.1、序列解包
同时给多个变量赋值
>>> x,y,z = 1,2,3
>>> print(x,y,z)
1 2 3
这种方式还可以交换多个变量的值
>>> x,y = y,x
>>> print(x,y,z)
2 1 3
这里执行的操作就叫序列解包(可迭代对象解包):将一个序列解包,并将得到的值存储在一系列变量中。
>>> values = 1,2,3
>>> values
(1, 2, 3)
>>> x,y,z = values
>>> x
1
>>> y
2
>>> z
3
在使用返回元组的函数或方法时很有用。假设要从字典中随机获取一个键值对,可用popitem,它随便获取一个键值对并以元组的方式返回。接下来,可直接将返回的元组解包到两个变量中。
>>> scoundrel = {'name':'Robin','girlfriend':'Marion'}
>>> key,value = scoundrel.popitem()
>>> key
'girlfriend'
>>> value
'Marion'
2.2、链式赋值
这是一种快捷方式,用于将多个变量关联到同一变量。
x = y = somefunction()
2.3、增强赋值
使用复合的运算符来赋值,如以下两种写法效果相同。
>>> x = x + 1
>>> x += 1
也可以用于其他数据类型
>>> fnord = 'foo'
>>> fnord += 'bar'
>>> fnord
'foobar'
3、代码块的缩进
在循环中,python依靠缩进判断是否在循环体中,python中的缩进也是判断代码块之间从属关系的重要条件。所以缩进一定要严谨。
4、条件和条件语句
在你编写的程序中,语句都是逐条执行的。现在更进一步,让程序选择是否执行特定的代码块。
4.1、布尔值
用布尔表达式,下面的值都被视为假:
False None 0 "" () [] {}
4.2、有条件地执行和if语句
if语句
在确定条件为真时执行指定语句,条件为假这不执行。
name = input("what your name: ")
if name == 'Gumby':
print("hello,Mr.Gumby")
4.3、else语句
在前面的示例中,输入Gumby即可打印出信息。
现在可以使用else语句来在输入值不是Gumby时执行其他操作。
name = input("what your name: ")
if name == 'Gumby':
print("hello,Mr.Gumby")
else:
print("hello")
但要注意,在if语句中只能有一个else语句
要处理多种情况的话,应使用elif语句。
4.4、elif语句
前文已经说了,在执行多种情况是要使用elif语句。
number = int(input("your number:"))
if number<3:
print("number<3")
elif number>3:
print("number>3")
else:
print("数字不属于上述情况")
elif语句需要指定条件,而else不用。但elif语句可以有无数个,else只能有一个。
4.5、代码块嵌套
说白一点,代码块嵌套就是在循环内部加上另一个循环。
4.6、运算符
表达式 | 描述 |
---|---|
x == y | x等于y |
x < y | x小于y |
x > y | x大于y |
x >= y | x大于或等于y |
x <= y | x小于或等于y |
x != y | x不等于y |
x is y | x和y是同一个对象 |
x is not y | x和y是不同的对象 |
x in y | x是容器y的成员 |
x not in y | x不是容器y的成员 |
4.7、断言
用于判断代码是否有问题,如果有则会让程序立即停止。
工作原理类似于下面的的代码
if not condition:
crash program
(了解即可,异常时会详细说)
5、循环
简单来说,就是满足条件是重复执行循环体内的代码。循环有四要素:
- 循环的起点
- 循环的终点
- 循环要做的事
- 每次循环的变化
以上条件缺一不可,缺少一个就会变成死循环。
5.1、while循环
下面是一个while循环的示例
x = 1
while x <= 100:
print(x)
x += 1
循环的起点是x=1,终点是x<=100,循环要做的事是打印x,变化是每次循环后x都会加一。
5.2、for循环
while循环非常灵活,可用在条件为真时反复执行。但对序列执行操作时for循环更为合适。
words = ['this','is','an','ex','parrot']
for word in words:
print(word)
这个for循环将words中的值依次存到word中,再打印出来。
有的时候需要一个范围内的数,这是需要使用range函数,这个函数可以生成一个范围内的所有整数。
>>> range(0,10)
range(0, 10)
>>> list(range(0,10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
注意:range生成的数包含开头的数但不包含结尾的数
使用for循环来打印1-100:
for num in range(0,101):
print(num)
5.3、迭代字典
要遍历字典的所有关键字,可像遍历序列那样使用普通的for语句
d = {'x':1,'y':2,'z':3}
for key in d:
print(key,'correspons to',d[key])
可使用d.items返回键值对,并在for循环中使用序列解包,把键和值分开。
d = {'x':1,'y':2,'z':3}
for key,value in d.items():
print(key,'corresponds to ',value)
5.4、一些迭代工具
5.4.1、并行迭代
同时迭代两个序列
name = ['anne','beth','george','damon']
age = [12,45,32,102]
for i in range(len(name)):
print(name[i],'is',age[i],'years old')
还有一个可以“缝合”两个序列的并行迭代工具——函数zip
它将两个序列组合,并返回一个由元组组成的序列。要查看内容,可以使用list转化为列表。
>>> list(zip(name,age))
[('anne', 12), ('beth', 45), ('george', 32), ('damon', 102)]
5.4.2、迭代时获取索引
strings = 'abcdxxx'
for index, string in enumerate(strings):
if 'xxx' in string:
strings[index] = '[censored]'
5.4.3、反向迭代和排序后再迭代
使用函数reversed和sorted可以返回修改后的版本。
5.5、跳出循环
循环会在条件满足是一直执行,但有的时候需要中断循环。
5.5.1、break
break可以直接中断整个循环,一般是在循环内嵌套if语句,当满足某一条件时跳出。
from math import sqrt
for n in range(99,0,-1):
root = sqrt(n)
if root == int(root):
print(n)
break
上面的循环从100开始向下迭代。找到一个平方值后跳出循环
5.5.2、continue
contiune没有break用的多,它结束当前迭代,并跳到下一次迭代开头,这个只会结束当前这一次循环,并不会中断纵膈循环。
5.6、列表推导
列表推导是一种从其他列表创建列表的方式,类似于数学中的集合推导,工作原理类似for循环
>>> [x * x for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
这个列表由range(10)内每个值的平方组成。
小结
函数 | 描述 |
---|---|
chr(n) | 返回一个字符串,其中只包含一个字符,这个字符对应于传入的顺序值n(0<=n<=256) |
eval(source[,globals[,locals]]) | 计算并返回字符串表示的表达式的结果 |
exec(source[, globals[,locals]]) | 将字符串作为语句执行 |
enumerate(seq) | 生成可迭代的索引--值对 |
ord(c) | 接受一个只包含一个字符的字符串,并返回这个字符的顺序值 |
range([start, ] stop[, step]) | 创建一个由整数构成的列表 |
reversed(seq) | 按相反的顺序返回seq中的值,以便用于迭代 |
sorted(seq[,cmp] [,key] [,reverse]) | 返回一个列表,其中包含seq中的所有值且这些值是经过排序的 |
xrange([start,] stop[, step]) | 创建一个用于迭代的xrange对象 |
zip(seq1, seq2,......) | 创建一个适合用于并行迭代的新序列 |