zoukankan      html  css  js  c++  java
  • 条件、循环及其他语句

    条件、循环及其他语句

    你现在肯定有点不耐烦了。这些数据类型确实好,可你却没法使用它们来做什么,不是吗?
    下面加快点速度。你已见过几种语句(print语句、import语句和赋值语句),先来看看这些
    语句的其他一些用法,再深入探讨条件语句和循环语句。然后,我们将介绍列表推导,它们虽然
    是表达式,但工作原理几乎与条件语句和循环语句相同。最后,我们将介绍pass、del和exec。

    5.1 再谈 print 和 import

    随着你对Python的认识越来越深入,可能发现有些你自以为很熟悉的方面隐藏着让人惊喜的
    特性。下面就来看看print和import隐藏的几个特性。虽然print现在实际上是一个函数,但以前
    却是一种语句,因此在这里进行讨论。

    对很多应用程序来说,使用模块logging来写入日志比使用print更合适,详情请参阅第19章。

    5.1.1 打印多个参数

    你知道,print可用于打印一个表达式,这个表达式要么是字符串,要么将自动转换为字符
    串。但实际上,你可同时打印多个表达式,条件是用逗号分隔它们:

    >>> print('Age:', 42) 
    Age: 42 
    

    如你所见,在参数之间插入了一个空格字符。在你要合并文本和变量值,而又不想使用字符
    串格式设置功能时,这种行为很有帮助。

    >>> name = 'Gumby' 
    >>> salutation = 'Mr.' 
    >>> greeting = 'Hello,' 
    >>> print(greeting, salutation, name) 
    Hello, Mr. Gumby 
    

    如果字符串变量greeting不包含逗号,如何在结果中添加呢?你不能像下面这样做:

    print(greeting, ',', salutation, name) 
    

    因为这将在逗号前添加一个空格。下面是一种可行的解决方案:

    print(greeting + ',', salutation, name) 
    

    它将逗号和变量greeting相加。如果需要,可自定义分隔符:

    >>> print("I", "wish", "to", "register", "a", "complaint", sep="_") 
    I_wish_to_register_a_complaint 
    

    你还可自定义结束字符串,以替换默认的换行符。例如,如果将结束字符串指定为空字符串,
    以后就可继续打印到当前行。'

    print('Hello,', end='') 
    print('world!')
    

    上述代码打印Hello, world!①。

    ① 仅当这些代码包含在脚本中时才如此。在交互式Python会话中,将分别执行每条语句并打印其内容。

    5.1.2 导入时重命名

    从模块导入时,通常使用

    import somemodule
    

    或使用

    from somemodule import somefunction 
    

    from somemodule import somefunction, anotherfunction, yetanotherfunction 
    

    from somemodule import * 
    

    仅当你确定要导入模块中的一切时,采用使用最后一种方式。但如果有两个模块,它们都包
    含函数open,该如何办呢?你可使用第一种方式导入这两个模块,并像下面这样调用函数:

    module1.open(...) 
    module2.open(...) 
    

    但还有一种办法:在语句末尾添加as子句并指定别名。下面是一个导入整个模块并给它指定
    别名的例子:

    >>> import math as foobar 
    >>> foobar.sqrt(4) 
    2.0 
    

    下面是一个导入特定函数并给它指定别名的例子:

    >>> from math import sqrt as foobar 
    >>> foobar(4) 
    2.0 
    

    对于前面的函数open,可像下面这样导入它们:

    from module1 import open as open1 
    from module2 import open as open2 
    

    有些模块(如os.path)组成了层次结构(一个模块位于另一个模块中)。有关模块结构
    的详细信息,请参阅10.1.4节。

    5.2 赋值魔法

    即便是不起眼的赋值语句也蕴藏着一些使用窍门。

    5.2.1 序列解包

    赋值语句你见过很多,有的给变量赋值,还有的给数据结构的一部分(如列表中的元素和切
    片,或者字典项)赋值,但还有其他类型的赋值语句。例如,可同时(并行)给多个变量赋值:

    >>> x, y, z = 1, 2, 3 
    >>> print(x, y, z) 
    1 2 3 
    

    看似用处不大?看好了,使用这种方式还可交换多个变量的值。

    >>> x, y = y, x 
    >>> print(x, y, z) 
    2 1 3 
    

    实际上,这里执行的操作称为序列解包(或可迭代对象解包):将一个序列(或任何可迭代
    对象)解包,并将得到的值存储到一系列变量中。下面用例子进行解释。

    >>> values = 1, 2, 3 
    >>> values 
    (1, 2, 3) 
    >>> x, y, z = values 
    >>> x 
    1
    

    这在使用返回元组(或其他序列或可迭代对象)的函数或方法时很有用。假设要从字典中随
    便获取(或删除)一个键值对,可使用方法popitem,它随便获取一个键值对并以元组的方式
    返回。接下来,可直接将返回的元组解包到两个变量中。

    >>> scoundrel = {'name': 'Robin', 'girlfriend': 'Marion'} 
    >>> key, value = scoundrel.popitem() 
    >>> key 
    'girlfriend' 
    >>> value 
    'Marion' 
    

    这让函数能够返回被打包成元组的多个值,然后通过一条赋值语句轻松地访问这些值。要解
    包的序列包含的元素个数必须与你在等号左边列出的目标个数相同,否则Python将引发异常。

    >>> x, y, z = 1, 2 
    Traceback (most recent call last): 
     File "<stdin>", line 1, in <module> 
    ValueError: need more than 2 values to unpack 
    >>> x, y, z = 1, 2, 3, 4 
    Traceback (most recent call last): 
     File "<stdin>", line 1, in <module> 
    ValueError: too many values to unpack 
    

    可使用星号运算符(*)来收集多余的值,这样无需确保值和变量的个数相同,如下例所示:

    >>> a, b, *rest = [1, 2, 3, 4] 
    >>> rest 
    [3, 4] 
    

    还可将带星号的变量放在其他位置。

    >>> name = "Albus Percival Wulfric Brian Dumbledore" 
    >>> first, *middle, last = name.split() 
    >>> middle 
    ['Percival', 'Wulfric', 'Brian'] 
    

    赋值语句的右边可以是任何类型的序列,但带星号的变量最终包含的总是一个列表。在变量
    和值的个数相同时亦如此。

    >>> a, *b, c = "abc" 
    >>> a, b, c 
    ('a', ['b'], 'c') 
    

    这种收集方式也可用于函数参数列表中(参见第6章)。

    5.2.2 链式赋值

    链式赋值是一种快捷方式,用于将多个变量关联到同一个值。这有点像前一节介绍的并行赋
    值,但只涉及一个值:

    x = y = somefunction() 
    

    上述代码与下面的代码等价:

    y = somefunction() 
    x = y 
    

    请注意,这两条语句可能与下面的语句不等价:

    x = somefunction() 
    y = somefunction() 
    

    有关这方面的详细信息,请参阅5.4.6节介绍相同运算符(is)的部分。

    5.2.3 增强赋值

    可以不编写代码x = x + 1,而将右边表达式中的运算符(这里是+)移到赋值运算符(=)
    的前面,从而写成x += 1。这称为增强赋值,适用于所有标准运算符,如*、/、%等。

    >>> x = 2 
    >>> x += 1 
    >>> x *= 2 
    >>> x 
    6 
    

    增强赋值也可用于其他数据类型(只要使用的双目运算符可用于这些数据类型)。

    >>> fnord = 'foo' 
    >>> fnord += 'bar' 
    >>> fnord *= 2 
    >>> fnord 
    'foobarfoobar' 
    

    通过使用增强赋值,可让代码更紧凑、更简洁,同时在很多情况下的可读性更强。

    5.3 代码块:缩进的乐趣

  • 相关阅读:
    HTTP/2的优先级
    JavaScript 日期权威指南
    岂曰无衣与子同袍
    Android项目中实现native调用
    关键渲染路径
    @ModelAttribute使用详解
    @SessionAttribute使用详解
    @ControllerAdvice 拦截异常并统一处理
    js获取文件MD5值
    Mybatis分页插件PageHelper的配置和使用方法
  • 原文地址:https://www.cnblogs.com/CSE-kun/p/14887594.html
Copyright © 2011-2022 走看看