第五章 条件、循环以及其他语句
5.1 再谈print和import
随着我们对于Python的认知越来越多,很多我们以前不清楚的东西慢慢都需要了解,下面在谈谈print和import等我们所不知道的一些地方。原来的print在python2.7中是一个语句,但python3.5中,print由一个语句,转变成一个函数,注意,这个转变很重要。可能比以前有用很多,而且还可能简洁很多。
提示 在这里,我们谈及了使用模板logging去写入日志比用print有用,但具体什么用,大家有个大致了解,以后在学习中遇到去处理即可。
5.1.1 打印多个参数
print可用于打印一个表达式,记住有两种情况的存在,如果你在里面输入的是字符串,就直接打印出来字符串,第二种情况就是把你输入的非字符串直接转换成字符串进行打印。而且,你需要注意的地方是,你可以打印多个表达式,条件是用逗号进行分隔它们:
print(‘age:‘,42)
看看出来的结果,就能发现,在参数之间插入了一个空格字符。
age: 42
在此,作者提出我们需要合并文本和变量值的时候,而又不想使用字符串格式设置功能的时候,这很有帮助。对于这点我的理解就是作者已经脱离了原本的print概念,而是提出了关于合并文本和变量值的一种做法,就是中间加入一个空格,但具体用在什么地方,我觉得还有待进一步的了解。
在下面作者又提出了一些有用的技巧,我现在为大家一一的介绍:
首先,我来介绍第一种的技巧:
name=‘Gumby‘ salutation=‘Mr.‘ greeting=‘Hello,‘ print(greeting,salutation,name)
从而,会得到这样的结果:
Hello, Mr. Gumby
作者在这里就进行了思考,如果变量greeting不包含逗号,那么如何处理,具体如下:
print(greeting+‘,‘,salutation,name)
这样的结果就能变成鱼上述答案一直的结果。
其次,就是第二种情况,如果我需要在每个我输入的表达式之间自己去添加分隔符,注意前面我们看看作者在上面的时候是干什么,是直接默认为空格,而现在我们有办法通过自己的需求进行设置:
print(‘I‘,‘wish‘,‘to‘,‘register‘,‘a‘,‘complaint‘,sep=‘_‘)
从而,得到答案即为:
I_wish_to_register_a_complaint
5.1.2 导入时重命名
从 模板导入,通常有四种情况,通常使用:
import somemodule
或使用
from somemodule import somefunctuon
或
import somemodule import somefunction,anotherfunction,yetanotherfunction
或
from somemodule import *
导入模板里面所有的东西的时候,用的是最后一个方式。如果你需要使用两个模板,而且他们都包含例如函数open之类的同名函数,这个时候肯定会出问题,那么此处你应该使用第一种方式去处理,当然你在具体使用的时候也需要注意要用的方法与方法:
module1.open(...)
module2.open(...)
作者在这里也提出了一些其他的方法:在语句末尾添加as子句并指定别名。下面是一个导入整个模块并给它指定别名的例子:
import math as foobar print(foobar.sqrt(4))
从而,得到答案就是:
2.0
而让偶感觉舒服的一点就是,作者在函数部分的处理,也能像刚刚上面的例子一样,命名别名,然后,导入:
from module1 import open as open1
from module2 import open as open2
5.2 赋值魔法
这里面也有很多我们需要去处理的细节。
5.2.1序列解包
赋值语句常常是给变量和数据结构的一部分(如列表的元素和切片,或者字典项)赋值,还有其他的赋值,例如,可同时给多个变量赋值,这个是以前没有的。当然,也可利用这种方式进行交换多个变量的值,这个部分总感觉容易用错,尽量不要用:
x ,y ,z=1,2,3 print(x,y,z) x,y=y,x print(x,y,z)
从而,我们来看看它的输出结果:
1 2 3 2 1 3
这里面其实就是在运用数据结构和算法设计的一些数据结构,文章中把这种操作称为序列解包(或可迭代对象解包):将一个序列(或其他可迭代对象)解包,并将得到的值存储到一系列变量中。(意思就是可迭代对象(不清楚就去查看数据结构或者算法设计)或者序列分配给变量,说白了,就是一个个读取,然后分配给变量)下面作者还举了一个具体的例子:
values=1,2,3 print(values) x,y,z=values print(x)
这里可以看出来得到的解包最后给了x,y,z三个变量,并最后输出了x,这个就是典型的序列解包,当然,你需要注意的一点就是,变量的数量要和你解包的数值一一对应,否则内容就会报错。而且,注意到这里的代码的第一行,直接给一个变量赋了三个值,结果就变成了一个元组;当然作者在这里提出来的在使用元组(或其他序列或可迭代对象)的函数或方法的时候很有用,具体怎么用,还是有待进一步的考究的。本文在后面也提出了在字典的一种情况,就是字典随机获取(或删除)一个键-值对,可使用方法popitem,它随机获取一个键-值对然后删除并且会以元组的方式进行返回。所以能进行上述的操作,但不能用pop这个方法,因为,不指定的时候删除最后一个,指定的时候删除对应的位置。但不会返回任何东西。
scoundre1={‘name‘:‘Robin‘,‘girlfriend‘:‘Marion‘} key,values=scoundre1.popitem() print(key,values)
对应的结果如下:
girlfriend Marion
这里作者也提醒了我们,要解包的序列包含的元素个数必须与你等号左边列出的目标个数相同,否则Python将引发异常。举个例子:
x,y,z=1,2
x,y,z=1,2,3,4
两种情况报错的内容大致都是一致的:
x,y,z=1,2 ValueError: not enough values to unpack (expected 3, got 2)
x,y,z=1,2,3,4 ValueError: too many values to unpack (expected 3)
注意,为了弥补上述的不足,这里提出了一个很有用的解决方法,就是使用星号运算符(*) 来搜集多余的值,这样无需保证值得数量和变量的数量是一样多的,下面具体举个例子可以看出:
a,b, *rest=[1,2,3,4] print(a,b,rest)
从而,我们就得到这样的答案:
1 2 [3, 4]
当然,带*的位置我们也能做出适当的调整,系统也会做出调整,如下一个示例:
name=‘Albus Percival Wulfric Brian Dumbledore‘ first,*middle,last=name.split() print(first,middle,last)
从而得到合适的答案:
Albus [‘Percival‘, ‘Wulfric‘, ‘Brian‘] Dumbledore
赋值语句的右侧可以是任何类型的序列,但带星号的变量最终包含的总是一个列表。在变量和值相等的情况下不会改变这种情况:
name=‘Albus Percival Wulfric ‘ first,*middle,last=name.split() print(first,middle,last)
当然,结果与上述是一致的:
Albus [‘Percival‘] Wulfric
5.2.2 链式赋值
链式赋值是一种快捷方式,用于将多个变量关联到同一个值,但只涉及到一个值,这很重要。
x=y=somefunction()
与上述代码一致的代码:
y=somefunction()
x=y
但与下面不等价:
x=somefunction()
y=somefunction()
5.2.3 增强赋值
其实在C/C++里面也很常见,x=x+1改变为x+=1,这个语句很常见,就叫做增强赋值。适用于所有的标准运算符,如*、/、%等。
增强赋值也可适用于其他数据类型(只要在双目运算符可以做到的这里都能做到,什么是双目,比如++等)
fnord=‘foo‘ fnord+=‘bar‘ print(fnord) fnord*=2 print(fnord)
从而,有下面的结果:
foobar foobarfoobar
5.3 代码块:缩进的乐趣
代码块不是语句,但你要理解这个内容,下面的东西才能讲下去:
代码块是一组语句的组合,可满足条件时执行(if)的语句、可执行多次的(循环语句),等等。代码块通过缩进(也就是加空格)来创建。说白了,C/C++等语言原来都是有括号{ }来保证其里面的内容,现在只是没有了{ },取而代之的缩进而已,记住每级缩进4个空格就可以了。具体,后面看看你就知道怎么用,在这不在赘述。
原文地址:https://www.cnblogs.com/liuxinkai94/p/10127375.html