1. 赋值语句常用技巧
通过序列解包(sequence unpacking)可以将多个值的序列解开,让后一一放置到变量的序列中。解包的序列中的元素必须和等号左边变量数量一致。如下:
1 values = 1,2,3 2 3 print values # output: (1, 2, 3) 4 5 x,y,z = values # output: 1 2 3 6 print x,y,z 7 8 bob_Info = {'name':'Bob','email':'[email protected]'} 9 key,value = bob_Info.popitem() 10 11 print value # output: Bob
1.2 链式赋值
通过使用链式赋值(chained assignment)可以将一个值同时赋给多个变量,如下:
x = y = z = 1 print x,y,z # output: 1 1 1
1.3 增量赋值
将表达式运算符(+
、-
、*
、%
、/
等)放置在赋值运算符(=)的左边,这些写法被称为增量赋值(augmented assignment),如下:
1 x = 6 2 3 x += 1 4 print x # output: 7 5 6 x *= 6 7 print x # output: 42
2. 缩进 —— Python语言的风格
Python和其他语言有一个很大的区别在于:Python 使用硬回车来分割语句,使用冒号(:)和缩进来分割代码块。同一层次的语句必须有相同的缩进(每一组这样的语句称为一个块),而C语言风格的编程语言(Java/C#/C++)则使用分号来分割语句,花括号来分割代码块。
正确的缩进
不要混合使用tab键和空格来进行缩进,这会使程序在跨平台时不能正常的工作。官方推荐的做法是使用四个空格
如下:
1 # --- coding: utf-8 --- 2 3 age = 20 4 if age < 21: 5 print '不能买酒' 6 print '但是你可以来块口香糖' 7 8 print '这句话处于If语句的外部'
3. 条件和条件语句
在Python中解释器认为标准值False、None和所有类型的数字0(浮点型,长整型等)、空序列(字符串、字典、列表等)都为假(False),如下所示:
1 print bool(False) # False 2 print bool(None) # False 3 print bool(0) # False 4 print bool("") # False 5 print bool(()) # False 6 print bool([]) # False 7 print bool({}) # False
3.2 条件执行和if语句
和C#中的If语句类似,如果if内的条件判定为真,则执行后面的语句块:
1 # -- coding: utf-8 -- 2 age = 18 3 4 if age >= 18: 5 print '年龄超过18岁了'
3.3 else子句
else子句作为if语句的一部分,如果if语句的条件被判定为“False”则执行else子句后的语句块,如下:
1 # -- coding: utf-8 -- 2 age = 16 3 4 if age >= 18: 5 print '年龄超过18岁了' 6 else: 7 print '未成年人'
3.4 elif子句
elif子句是“else if”的简写,通过elif子句可以检查更多的条件,如下:
1 num = input('Enter a number: ') 2 3 if num > 0: 4 print 'The number is positive' 5 elif num < 0: 6 print 'The number is negative' 7 else: 8 print 'The number is zero'
3.5 嵌套代码块
有时候我们需要更加复杂的条件分支判定,这时可以嵌套使用if语句来实现,如下:
1 num = raw_input('Enter a number: ') 2 3 if name.endswith('Gumby'): 4 if name.startswith('Mr.'): 5 print 'Hello. Mr.Gumby' 6 elif name.startswith('Mrs.'): 7 print 'Hello, Mrs. Gumby' 8 else: 9 print 'Hello,Gumby' 10 else: 11 print 'Hello,Stranger'
3.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容器(序列等)的成员 |
同一性运算符
在Python中使用is
运算符来进行同一性判断(即是否属于同一个对象),而相等性运算符(==
)用来判断两个对象是否相等,区别如下代码所示:
1 x = [1,2,3,4,5] 2 y = [1,2,3,4,5] 3 4 print x == y # True 5 print x is y # False 6 7 z = y 8 print z is y # True
避免将is运算符用于比较不可变值(如:数值类型,字符串等)
成员资格运算符
使用in
来判断某一元素是否属于容器中的成员。如下:
1 book = 'Dive Into Python' 2 3 print 'P' in book # True
字符串和序列比较
字符串(字符是按照本身的顺序值排列的)可以按照字母排序进行比较,如:
print 'alpha' < 'beta' # True
不过实际的排序结果和使用不同的locale而变化。
locale模块提供了C本地化(localization)函数的接口,同时提供相关函数,实现基于当前locale设置的数字,字符串转换(int/float/string模块中的转换函数不受locale设置的影响)。更多locale模块的信息,可以参考这里:http://docs.python.org/2/library/locale.html。
序列之间也可以通过对比序列中的元素来进行比较:
1 print [1,2] < [2,1] # True 2 print [1,[2,3]] > [1,[2,4,5]] # False
布尔运算符
常用的布尔运算符有:
- and(&&)
- or(||)
- not(!)
和在C#这些语言中不同,在Python中直接通过它们对应的单词使用,如:
1 age = 12 2 3 if age > 6 and age <= 12: 4 print 'schoolchild' 5 else: 6 print 'not schoolchild'
4. 断言
assert语句失败的时候,会引发一个AssertionError。 与其让程序在晚些时候崩溃,不如在错误条件出现时直接让它崩溃,在Python中我们可以通过使用assert语句来实现一个断言,assert语句失败的时候会抛出AssertionError异常。如下:
1 # -- coding: utf-8 -- 2 mylist = ['item'] 3 assert len(mylist) >= 1 4 mylist.pop() 5 assert len(mylist) >= 1 '断言失败,程序终止运行'
5. 循环
while循环中的表达式如果为True就会一直执行其后的语句块,如下打印0-100的值:
1 x = 0 2 while x <= 100: 3 print x 4 x += 1
5.2 for循环
在Python中for循序的使用方法基本和C#中的foreach一样,使用for循环打印0-100的值:
1 numbers = range(0,101) 2 for num in numbers: 3 print num
使用for循环遍历字典
1 # -- coding: utf:8 -- 2 dic = {'a':1,'b':2,'c':3,'d':4,'e':5} 3 for key in dic: 4 print key, '对应',dic[key] 5 6 # 循环中使用序列解包 7 for key,value in dic.items(): 8 print key, '对应',value
5.3 使用迭代工具
Python为了为了方便迭代序列提供了一些很好的工具函数。这些函数有Python内建的,但是大部分位于:itertools模块中,更多信息可以参考Python文档:http://docs.python.org/2/library/itertools.html
并行迭代
通过使用Python内建的zip
函数可以将两个序列合并为一个元组:
1 # -- coding: utf-8 -- 2 names = ['anne','beth','george','damon'] 3 ages = [12,45,32,102] 4 5 # 将两个序列“压缩”在一起,返回一个元组的列表 6 poeples = zip(names,ages) 7 8 # 再循环中解包元组 9 for name,age in poeples: 10 print name, 'is', age, 'years old'
元组的长度等于相对较短序列的长度。如下:
1 # output: [(0, 0), (1, 1), (2, 2)] 2 print zip(range(3),xrange(100))
编号迭代
如果需要在迭代序列的同时还要获取当前迭代对象的索引,可以使用下面的方法:
1 # -- coding: utf-8 -- 2 3 strings = ['2','1','2','2','1'] 4 5 index = 0 6 for string in strings: 7 if '2' in string: 8 strings[index] = '1' 9 index += 1 10 # output: ['1', '1', '1', '1', '1'] 11 print strings
或者是直接使用内建的ernumerate
函数:
1 # -- coding: utf-8 -- 2 3 strings = ['2','1','2','2','1'] 4 5 for index,string in enumerate(strings): 6 if '2' in string: 7 strings[index] = '1' 8 # output: ['1', '1', '1', '1', '1'] 9 print strings
翻转和排序迭代
reversed和sorted这两个函数可以使用在任何序列或可迭代对象,返回的是翻转或者排序后的版本。如下:
1 # -- coding: utf-8 -- 2 3 # output: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 4 print sorted([9,1,8,2,6,5,4,3,7,0]) 5 6 # output: ['!', 'e', 'h', 'l', 'l', 'o'] 7 print sorted('hello!') 8 9 # reversed 返回的是一个可迭代对象 10 # 通过list()函数将对象转换为列表 11 # output: ['!', 'o', 'l', 'l', 'e', 'h'] 12 print list(reversed('hello!')) 13 14 # output: !olleh 15 print ''.join(reversed('hello!'))
5.5 跳出循环
break: Python使用break语句跳出循环:
1 # -- coding: utf-8 -- 2 import random 3 4 while True: 5 # 生成0-9之间的随机数 6 num = random.randrange(0,10) 7 print num 8 if num == 6: 9 break
continue: continue语句会让当前的迭代结束,直接开始下一轮的循环,如下所示:
1 # -- coding: utf-8 -- 2 3 # 输出:6 4 for num in xrange(1,10): 5 if num == 1:continue 6 if num == 2:continue 7 if num == 3:continue 8 if num == 4:continue 9 if num == 5:continue 10 print num 11 break
6.列表推导式
列表推导式(list comprehension)是利用其它列表创建新列表的一种方法,如下:
1 # -- coding: utf-8 -- 2 3 # output: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 4 # 列表元素x由其自身的平方根组成 5 print [x*x for x in range(10)]
增加条件: 我们还可以为创建的元素添加其它条件,如下:
1 # -- coding: utf-8 -- 2 3 # output: [0, 10, 20, 30, 40, 50] 4 # 列表元素x由其自身*2的倍数组成,且能被5整除 5 print [x*2 for x in range(30) if x % 5 ==0]
多个for语句: 还可以通过使用多个for语句来生成列表:
1 # -- coding: utf-8 -- 2 3 # output: [(0, 0), (0, 1), (1, 0), (1, 1)] 4 # 生成x和y的所有组合 5 print [(x,y) for x in range(2) for y in range(2)]
下面的for循环部分创建的列表和上面的推导式一样:
1 # -- coding: utf-8 -- 2 3 result = [] 4 for x in range(2): 5 for y in range(2): 6 result.append((x,y)) 7 # output: [(0, 0), (0, 1), (1, 0), (1, 1)] 8 print result
7. pass/del/exec 语句
pass语句——代码中的占位符: pass
语句在Python代码中充当占位符使用。比如说现在马上就要测试一个if语句,但是其中还缺少一个语句块(代码不会执行,Python中空代码块是非法的),这个时候我们可以暂时使用pass语句来填充,如下:
1 # -- coding: utf-8 -- 2 3 age = 12 4 age = 5 5 if age > 6 and age <= 12: 6 print 'schoolchild' 7 else: 8 # 未完成 9 pass
使用del语句删除
Python解释器通过垃圾回收可以将内存中没有任何引用的对象给清理掉。我们也可以通过del语句我们也可以直接将一个对象从内存中清除,如下:
1 # -- coding: utf-8 -- 2 3 x = ['hello','world'] 4 5 del x 6 # NameError: name 'x' is not defined 7 print x
使用exec和eval执行和求值字符串
使用exec
语句可以执行存储在字符串中的Python代码,如下:
1 # output: hello,world 2 exec "print 'hello,world'"
通过使用eval
语句可以计算以字符串形式书写的Python表达式,我们可以在Python交互解释器中输入如下代码:
>>> eval(raw_input("Enter an arithmetic expression: +")) Enter an arithmetic expression: +16+16 32 >>>
我们在程序中输入了:16+16的表达式,通过eval执行后返值:32
为了提高程序的安全性,我们可以为exec语句和eval语句增加一点包装,将这些语句限制在特定的作用域中,如下:
1 scope = {} 2 exec 'sqrl = 6' in scope 3 print scope['sqrl'] # output: 6 4 5 scope = {} 6 scope['x'] = 2 7 scope['y'] = 3 8 9 print eval('x * y',scope) # output: 6
警告
在Python中使用exec执行Python代码字符串和通过eval语句计算Python表达式,这样的做法并不推荐,因为这样会有潜在的严重漏洞。 因为可能会有用户提供一些恶意的字符串作为代码或表达式来执行,这样程序会有潜在失去控制的危险。记住:在python中并没有任何执行不可信任代码的安全方式。
参考资料&进一步阅读
Python基础教程(第二版)
简明Python教程
深入 Python :Dive Into Python 中文版
Python 维基百科