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)

猜你喜欢

转载自www.cnblogs.com/yinsedeyinse/p/11156717.html