Python核心技术与实战——五|条件与循环
我们在前面学习了列表、元组、字典、集合和字符串等一系列Python的基本数据结构类型,下就需要把这一个个基本的数据串在一起了,这就要用到我们今天要讲的东西——”条件与循环“。
一.条件语句
条件语句的用法很简单,比如我们想要表示y=|x|这个函数,那么对应的代码就是这样的(简化代码不考虑异常,后面的也一样)
#y = |x| x = float(input('>>>')) if x < 0: y = -x else: y = x
要注意的是Python和其他的语言不同,在条件语句中是不能加括号的,句末也要加上冒号。这是Python特定的语法规范。
if (x<0)
Python是不支持switch语句的,在多个条件判断时,我们要用else if实现。在Python的用法时elif,大概就是这么个思路
if case1: do 1 elif case2: do 2 elif case3 do 3 else: do n
其中if语句是可以单独使用的,而elif和else必须要和if配套使用。
有些时候为了简化代码,可以将判定的条件省略,可以这么用:
s = 'this is a string' l = ['a','b','c'] i = 123 if s: print('字符串非空') if l: print('列表非空') if i:print('整数不为0') #注意这样的写法(在同一行)也是可以的
判定条件的省略用法大概是下面几种
数据类型 | 结论 |
String | 空字符串解析为False,其余为Ture |
Int | 0解析为False,其余为Ture |
Bool | Ture为Ture |
list/tuple/dict/set | iterable为空的时候为False,其余都为True |
Object | None为False,其余为True |
但是在实际应用时,除了Bool类型的数据,条件的判定条件最好时显性的,也就是说最好写出来判定的条件,为后期的维护和他人的阅读创造好的条件。比如判定一个数是否为0
if i: print('这个数是0') if i==0: print('这个数是0')
显而易见下面的语法更加的易读。特别是在一堆代码段中,要搞明白这些也是不容易的。
二.循环语句
循环的本质就是遍历集合中的元素。Python的循环一般通过while和for来实现。
for循环常常用于对可迭代对象的遍历
d = {'name':'jack', 'age':20, 'job':'hr'} for key in d: print(key) #遍历字典的key for value in d.values(): print(value) #遍历字典的value for k,v in d.items(): print('key:{},value:{}'.format(k,v)) #遍历键值对
这里举例的是字典,因为字典本身只有key是可迭代的,如果我们要遍历它的值或键值对,就要用到字典的内置函数value()或items()来实现。而在有些情况里还可以通过range()函数拿到索引,再去遍历集合中的元素
l = ['a','b','c','d','e','f','g'] for index in range(0,len(l)): if index<3: print(index,l[index])
当我们同时需要索引和元素时,还有一种更加简洁的方式:利用Python的内置函数enumera()。用它来遍历集合,不仅返回每个元素,还返回其对应的索引,那么上面的代码就可以写成这样的
l = ['a','b','c','d','e','f','g'] for index,item in enumerate(l): if index < 5: print(item)
在循环语句中,我们还常常搭配continue和break一起使用。continue就是跳过当前这一段循环,继续执行下面一轮循环,而break就是完全跳出整个循环体。适当的结合continue和break,会使纯光绪更加简洁、易读。举个例子:现在有两个字典,分别时产品名称到价格的映射和产品名称到颜色列表的映射。如果我们想找出价格小于1000的,并且颜色不是红色的所有产品名称和颜色的组合,不用continue就是这样的
name_price = {} name_color = {} for name,price in name_price.items(): if price < 1000: if color in name_color: for color in name_color[name]: if color != 'red': print('name:{},color:{}'.format(name,color)) else: print('name:{},color:{}'.format(name,'None'))
而加上continue就简单的多
name_price = {} name_color = {} for name,price in name_price: if price >= 1000: continue if name not in name_color: continue for color in name_color[name]: if color == 'red': continue print('name:{},color:{}'.format(name,color))
可以看出来第一种方法有5层for或if的嵌套,而第二种方法加上Continue只有3层嵌套。
前面讲的是for循环,其实对于while循环原理也是一样的,只要在condition满足时,一直重复循环体内部的操作,知道condition不再满足,就跳出循环体。
while contition: ...
很多时候for和while循环可以相互转换,比如上面用for循环遍历列表,要是用while循环也可以完成。
l = ['a','b','c','d','e','f','g'] index = 0 while index<len(l): print(l[index]) index +=1
那么这两种用法有什么区别呢?如果只是遍历一个已知的集合,找出满足条件的元素并进行相应的操作,那么使用for循环更加简洁。但如果需要在满足某个条件前不停的重复某些操作,并没有特定的集合需要遍历,那么使用一般使用while循环。比如如果有个交互式的问答系统,在接收到输入信息为‘q’时程序退出。这个时候一般是不用for循环的。
while True: data = input('>>>') if data == 'q': print('stop') break else: print(data)
三.for和while的效率
两种循环的效率问题是应该关注的。
i = 0 while i < 1000000: i =+ 1 for i in range(0,1000000): pass
这两个循环是等价的,而由于range()函数是由C语言直接写的,调用的速度非常快;而while循环中的 i +=1这个操作是通过Python解释器直接调用底层的C语言;并且这个操作涉及到对象的创建和删除(因为i是int,是immutable,i += 1相当于i = new(i +1)。所以for循环的效率会更高。
四.条件和循环的复用
有些时候会把条件和循环并在一行的操作,例如
#复写方法 expression1 if condition else expression2 for item in iterable #分开写法 for item in iterable: if condition: expression1 else: experssion2
而如果没有else语句,就可以这么写
experssion for item in iterable if condition
举个例子,比如我们要绘制f(x)=2|x|+5的函数图,就要根据x数据点算出对应的y的值,那么用一行代码就可以了
x = [-5,-4,-3,-2,-1,0,1,2,3,4,5] y = [value*2+5 if value >0 else -value*2+5 for value in x] print(y)
熟练之后,会发现这种方式非常方便,但是如果逻辑比较复杂的时候一行就难于理解,也容易出错不利于他人读代码。用正常的方式写代码也是一种好的规范和选择。
五.思考题
由两个列表attributes和values,然后针对values中每一组子列表value,输入器和attributes中的键对应后的字典,最后返回字典组成的列表
attributes = ['name', 'dob', 'gender'] values = [['jason', '2000-01-01', 'male'], ['mike', '1999-01-01', 'male'], ['nancy', '2001-02-01', 'female'] ] # expected outout: [{'name': 'jason', 'dob': '2000-01-01', 'gender': 'male'}, {'name': 'mike', 'dob': '1999-01-01', 'gender': 'male'}, {'name': 'nancy', 'dob': '2001-02-01', 'gender': 'female'}]
可以试试用两种方式来完成:复用的或者分行的:
out = [] for value in values: person = {} for index in range(len(value)): person[attributes[index]] = value[index] out.append(person) print(out)
单行版:
out = [{attributes[i]: value[i] for i in range(len(attributes))} for value in values ] print(out)