第五章 条件、循环和其他语句
5.1 print和import的更多信息
5.1.1 使用逗号输出
>>> print('age',43,45) // 可以用逗号隔开多个表达式,中间会有空格
age 43 45
5.1.2 把某事件作为另外事件的导入
import somemodule
from somemodule improt aaa, bbb, ccc
from somemodule import *
如果两个模块有同名函数怎么办?
第一种方法可以用模块引用:
module1.open()
module2.open()
另外一种方法是:给模块起别名,或者给函数起别名
>>> import math as foobar
>>> foobar.sqrt(3)
1.7320508075688772
5.2 赋值魔法
5.2.1 序列解包
>>> x,y,z = 1,2,3 // 可以为多个值同时赋值
>>> print(x,y,z)
1 2 3
>>> x,y // 交换两个值
(1, 2)
>>> x,y = y, x
>>> x, y
(2, 1)
序列解包(或递归解包):将多个值的序列解开,放到变量的序列中。
当函数或方法返回元组(或其他序列或可选迭代对象)时,这个特性尤为重要。
>>> source = {'name':'Robin','girlfriend':'marion'}
>>> key, value = source.popitem() // 函数返回的值打包成元组。
>>> key, value
('girlfriend', 'marion')
5.2.2 链式赋值
>>> x = y = "fsdfsd"
>>> x, y
('fsdfsd', 'fsdfsd')
5.2.3 增量赋值
+= / *=
5.3 语句块:缩排的乐趣
语句块:条件为真时,执行或者执行多次的一组语句。在代码前放置空格来缩进语句即可创建语句块
python中,冒号用来标识语句块的开始;块中的语句都是缩进的,并且缩进量相同。当回退到和已闭合
的块一样的缩进量时,就表示当前块已经结束。
5.4 条件和条件语句
5.4.1 这就是布尔变量的作用
真值:下面的值在作为布尔表达式的时候,会被解释器看做假(false)
False None 0(包括浮点,长整和其他类型) "" () [] {}
5.4.2 条件执行和if语句
5.4.3 else子句
5.4.4 elif
5.4.5 嵌套代码块
name= input("what is your name?") if name.endswith('Gumby'): if name.startswith('Mr.'): print("hello MR Gumyby") elif name.startswith('Mrs.'): print('Hello Mrs. Gumy') else: print('hello Gumby') else: print('hello, stranger') name = input('jfsdljfs')
5.4.6 更复杂的条件
(1)比较运算符
x == y/ x<y / x > y / x >=y / x<=y / x != y / x is y / x is not y/ x in y /x not in y
0 < age < 100 // 运算符可以连接
(2)相等运算符
==
(3)is: 同一运算符
>>> x = y = [1,2,3]
>>> z = [1,2,3]
>>> x == y
True
>>> x == z // 相等性判定,判断数值是否相等
True
>>> x is y
True
>>> x is z // 同一性判定, 判断对象是否是同一个
False
(4)in:成员资格运算符
(5)字符串和序列比较
>>> "abc" < "edf"
True
>>> "abc".lower() == "def".upper()
False
>>> [1,[1,3]] < [1,[1,4]]
True
(6)布尔运算符
if XX and YY or ZZ // 也满足短路逻辑
5.4.7 断言
>>> age = 10
>>> assert 100<age<10000
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
assert 100<age<10000
AssertionError
5.5 循环
5.5.1 while循环
x = 1
while x <= 100:
print(x)
x +=1
5.5.2 for 循环
>>> words = ['this','is','an','ex','parrot']
>>> for word in words:
print(word)
this
is
an
ex
parrot
>>>
>>> for xx in range(10): // range函数类似于分片,包含下限,但是不包含上限
print(xx)
0
1
2
3
4
5
6
7
8
9
>>>
5.5.3 循环遍历字典
>>> d = {'x':1, 'y':2, 'z':3}
>>> d
{'x': 1, 'y': 2, 'z': 3}
>>> for key in d:
print(key, " -- ",d[key]) // 字典的迭代顺序是不一定的
x -- 1
y -- 2
z -- 3
>>> for key, value in d.items():
print(key, '-', value) // 字典的迭代顺序是不一定的
x - 1
y - 2
z - 3
>>>
5.5.4 一些迭代工具
python中有一些函数非常好用,有些在itertools中,有一些是内建函数
(1)并行迭代
>>> names = ['anne','beth','george','damon']
>>> ages = [12, 45, 32, 102]
>>> for i in range(len(names)):
print(names[i],' ',ages[i])
>>> for name, age in zip(names, ages): // zip函数可以进行并行迭代,zip函数也可以用于不等长的列表,短的“用完”就停止
print(name,age)
anne 12
beth 45
george 32
damon 102
(2 ) 按索引迭代
strings = ['aa','bb','cc']
>>> for index, string in enumerate(strings):
if 'aa' in string:
strings[index] = "zzzz"
>>> strings
['zzzz', 'bb', 'cc']
(3)翻转和排序迭代
reversed和 sorted函数
>>> sorted([4,6,9,2])
[2, 4, 6, 9]
>>> var = reversed('hello world')
>>> var
<reversed object at 0x0000020AF7EEC7B8>
>>> list(var)
['d', 'l', 'r', 'o', 'w', ' ', 'o', 'l', 'l', 'e', 'h']
>>> ''.join(reversed('hello world'))
'dlrow olleh'
5.5.5 跳出循环
(1)break: 跳出循环
(2)continue: 跳出本次循环,执行下一轮循环
(3)while true用法
while True: word = input("please input a word?") if not word:break print('this workd was' +word) name = input('jfsdljfs')
5.6 列表推倒式-轻量级循环
利用其它列表创建新列表
>>> [x*x for x in range(0, 10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> [x*x for x in range(0, 10) if x % 3 ==0] // 增加一个if部分
[0, 9, 36, 81]
>>> [(x,y) for x in range(0, 10) for y in range(0,4)] // 也可以有多个for语句
[(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3), (3, 0), (3, 1), (3, 2), (3, 3), (4, 0), (4, 1), (4, 2), (4, 3), (5, 0), (5, 1), (5, 2), (5, 3), (6, 0), (6, 1), (6, 2), (6, 3), (7, 0), (7, 1), (7, 2), (7, 3), (8, 0), (8, 1), (8, 2), (8, 3), (9, 0), (9, 1), (9, 2), (9, 3)]
>>>
5.7 三人行
5.7.1 占位符:pass
var = "fsdf" if var == "fsdfsd": print("fsd") elif var == "vcxfds": pass elif var == "fsdfs": print("fsd") name = input("fsdfsd")
5.7.2 使用del删除
>>> x = ['hello','world'] >>> y = x >>> del y //删除y后,并不会影响x, 因为只是删除y这个名字,而值不会删除。值是通过垃圾回收来删除的 >>> x ['hello', 'world']
5.7.3 使用exec和eval执行和求值字符串
>>> exec("print('fds')") // 执行字符串中存储的代码,这样会有安全漏洞
fds
>>> eval("5*5") // 和exec类似,不同点是,eval会计算值并且返回结果
25