zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    sizeof
    {面试题10: 二进制中1的个数}
    {面试题9: 斐波那契数列}
    gcc常用选项
    mount.nfs: access denied by server while mounting localhost:/home/xuwq/minilinux/system
    ubuntu bash提示找不到文件或目录
    linux 编译内核[scripts/kconfig/dochecklxdialog] 错误
    最简单的抓包程序
    linux命令行解析函数介绍
    逻辑地址到线性地址的转换
  • 原文地址:https://www.cnblogs.com/yinsedeyinse/p/11156717.html
Copyright © 2011-2022 走看看