文章目录
条件,循环和其他语句
5.1 import的更多信息
1 2 3 4 5 |
import somemodule from somemodule import somefunction from somemodule import somefunction, anotherfunction, yetanotherfunction from somemodule import * |
- 只有确定要从目标模块导入所有功能时,才应该使用最后的版本
- 重名可以使用somemodule.somefunction模式导入
- 可以使用改名
import somemodule as sm
为导入部分提供别名
5.2 赋值魔法
5.2.1 序列解包
定义
将多个值的序列解开,放到变量的序列中,叫做’序列解包’或者’递归解包’
用法
- 在函数或者方法(或者其他序列和可迭代对象)时,这个特性尤其有用
- 对于字典,使用popitem获得项后得到元组后使用序列解包获取键或值
- 对于python3以后,可以使用*x收集剩余元素:右侧的赋值语句可以使可迭代对象
5.2.2 链式赋值
1 2 |
x=y=somefunction |
5.2.3 增量赋值
1 2 |
x+=z->x=x+z |
只要二元运算符本身适合这些数据类型即可
5.3 语句块:缩排的乐趣
定义
- 语句块是在条件为真的时执行或者执行多次的一组语句,在代码钱放置空格可以创建语句块
- 使用tab也可以缩进语句块.python将一个tab解释为到下一个tab字符位置的以移动,而一个tab为八个空格,但标准只是用空格.
5.4 条件和条件语句
bool
在Python中,下面的值会看做假:
- Flase
- None
- 0
- ”
- ()
- []
- {}
其他的一切都会被解释为真
组成
1 2 3 4 5 6 7 8 9 |
if condition: pass elif condition1: pass elif condition2: pass else: pass |
当然支持嵌套
5.4.6 更复杂的条件
比较运算符
表达式 | 描述 |
---|---|
x==y | x等于y |
xx小于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容器的成员 |
- 3.0以前,理论上,对于相对大小的任意两个对象x和y都是可以用比较运算符比较的,并且都会得到布尔值的结果
- 只有在x和y类型相近时,比较才有意义
- 在3.0以后,比较不兼容的类型已经完全不可行
- python中,支持链式比较
- 和c/c++一样,对于字符串,比较运算符可以比较他们的编码值
逻辑短路和条件表达式
布尔运算符的有趣特性–只在需要时求值
1 2 3 |
x and y # if x==false, skip y and return false x or y # if x==True, skip y and return True |
so
1 2 |
- a if b else c # if b==True return a,else c |
断言
1 2 3 4 5 6 |
>>> assert <condition> '<prompt>' #if not condition Traceback (most recent call last): File"<stdin>",line 1,in ? AssertError |
确保条件一定为真,才能让程序运行
5.5 循环
5.5.1 while循环
1 2 3 |
while bool: pass |
5.5.2 for循环
for循环用于比如为一个集合(序列或者其他可迭代对象)的每一个元素都执行一个代码块类似的操作
1 2 3 |
for number in numbers: pass |
“范围函数”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
class range(object) range(stop) -> range object range(start, stop[, step]) -> range object # range"函数"若给予一个参数默认为[0,stop) # 若给予两个以上参数为[start,stop),若给与step则客制化步长 # 在python2中range生成一个列表,xrange生成一个可迭代对象,故应尽量选择xrange # 在python3中xrange取代range,并占用了range之名,range不再存在 **循环遍历字典** ```python for key in D: pass #默认遍历字典的键 for key,value in D.items(): pass #遍历键值对 for value in D.values(): #遍历字典值 |
- python2.2之前,只能用keys等字典方法获得值
- 字典元素的顺序通常没有定义,如果这个顺序真的很重要,可以用列表保存一份键的顺序
5.5.4 一些迭代工具
并行迭代
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class zip(object) zip(iter1 [,iter2 [...]]) --> zip object #以下两段代码功能功能相似 for x in range(n): operate lst1[x],lst2[x] for a,b in zip(lst1,lst2): operate a,b #原理如下 >>> zip(lst1,lst2) [(lst1[0],lst2[0]),......] |
- zip处理不等长序列可行,但是会在较短的序列结束时结束
按索引迭代
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#以下两种方式作用类似 index=0 for string in strings: if 'xxx' in string: strings[index]='[censored]' index+=1 for index,string in enumerate(strings): if 'xxx' in string: strings[index]='[censored]' #解释:enumerate"函数"提供索引\值对的可迭代对象 class enumerate(object) enumerate(iterable[, start]) -> iterator for index, value of iterable Return an enumerate object. iterable must be another object that supports iteration. The enumerate object yields pairs containing a count (from start, which defaults to zero) and a value yielded by the iterable argument. enumerate is useful for obtaining an indexed list: (0, seq[0]), (1, seq[1]), (2, seq[2]), ... |
5.5.5 跳出循环
中断
1 2 3 |
for x in seq: if condition:break #中断本次循环并不继续 |
继续
1 2 3 |
for x in seq: if condition:continue #中断本次循环,并继续后续 |
While True/break习语
1 2 3 |
while True: if condition:break |
循环中否则
1 2 3 4 5 |
for x in seq: if condition:break else: pass |
只在break没有被触发,也就是程序正常进行的情况下引起else子句
5.6 列表推导式:轻量级循环
1 2 3 4 |
#示例:一般形式为[语句 for x in <iterable> [<condition>]] >>> [x*x for x in range(10) if x %3 ==0] [0,9,36,81] |
一个案例及其优化方案
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#方案一 girls=['alice','bernice','clarice'] boys=['chris','arnold','bob'] [b+'+'+g for b in boys for g in girls if b[0]==g[0] ] #方案二:效率高于方案一 girls=['alice','bernice','clarice'] boys=['chris','arnold','bob'] letetrGirls={} for girl in girls: letterGirls.setdefault(girl[0],[]).append(girl) [b+'+'+g for b in boys for g in letterGirls[b[0]]] |
5.7 三人行
5.7.1 什么都没发生
1 2 3 |
>>> pass >>> |
- pass语句在可以在代码中做占位符使用
- 空代码在python中是非法的
5.7.2 删除
- 一般来说,python会删除那些不再使用的对象(因为使用者不会再通过任何变量或者数据结构引用它们)
- 没有任何名字绑定的变量,就是’漂’着的,没有办法获取和使用它们,所以python解释器会以其魔法的方法进行’垃圾收集’
- 或者,我们可以使用del语句,他不仅删除一个对象的引用,也删除那个名字本身
- Python中无法删除值,这个功能由python解释器负责
5.7.3 动态创造Python代码,执行和对其求值
- 这是”黑暗魔法”,使用务必慎之又慎
- 这种方法会有很严重的潜在安全漏洞,程序可能失去对代码的控制
- 在python2中,这些都是语句,而非函数
exec
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
>>> exec("print('hello world')") hello world # 上面非常危险,可能有恶意代码,或者和你的变量冲突的代码 # 使用命名空间(作用域),以保证安全 >>> from math import sqrt >>> scope={} >>> exec("sqrt=1",scope) >>> sqrt(4) 2.0 >>> scope['sqrt'] 1 # python2版本 >>> from math import sqrt >>> scope={} >>> exec "sqrt=1" in scope >>> sqrt(4) 2.0 >>> scope['sqrt'] 1 # python3中exec函数原型及其解释 ''' exec(source, globals=None, locals=None, /) Execute the given source in the context of globals and locals. The source may be a string representing one or more Python statements or a code object as returned by compile(). The globals must be a dictionary and locals can be any mapping, defaulting to the current globals and locals. If only globals is given, locals defaults to it. ''' |
eval
1 2 3 4 5 6 7 8 9 10 11 12 |
#原型与解释 ''' eval(source, globals=None, locals=None, /) Evaluate the given source in the context of globals and locals. The source may be a string representing a Python expression or a code object as returned by compile(). The globals must be a dictionary and locals can be any mapping, defaulting to the current globals and locals. If only globals is given, locals defaults to it. ''' |
- eval用于求值,会执行一系列python语句,计算python表达式,并且返回结果值
- 和exec一样,也可以提供命名空间,一个全局的,一个局部的.全局的必须是字典,局部的可以是任意映射,设置全局后局部会默认设置为全局