第五章 条件、循环及其他语句
5.1再谈print和import
5.1.1打印多个参数
print可用于打印多个表达式,条件是用逗号分隔它们。默认会在输出时在逗号两边的内容之间加入一个空格
>>> print('Age:',42)
Age: 42
如果你不想要这个空格,或者想要其他分隔符,使用sep='xxx' 可以自定义分隔符。
>>> print("I","wish","to","register","a","complaint",sep='_')
I_wish_to_register_a_complaint
还可以使用end = 'xxx' 来自定义结束符(默认未换行),在交互式python会话中不可行。
5.1.2 导入时重命名
导入模块中所有函数 from somemodule import *
为避免导入模块的函数名重复的问题,可以使用 from somemodule import somefunction as function
当然,除了给某个函数别名外,也可以给某个模块别名 import somemodule as module
>>> import math as foobar
>>> foobar.sqrt(4)
2.0
>>> from math import sqrt as foobar
>>> foobar(4)
2.0
5.2 赋值魔法
5.2.1 序列解包
可以同时(并行)给多个变量赋值
>>> x,y,z = 1, 3, 5
>>> print(x,y,z)
1 3 5
可以交换多个变量的值
>>> x, y = y, x
>>> print(x,y,z)
3 1 5
实际上,这里执行的操作成为序列解包(或可迭代对象解包):将一个序列(或任何可迭代对象)解包,并将得到值存储到一些列的变量中。下面用例子解释:
>>> values = 1,2,3
>>> x,y,z = values
>>> x
1
需要注意的是,等号左右列出的目标个数必须相等。不相等时,可以用*来收集多余的值
>>> a,b,*rest = [1,2,4,5,6,7]
>>> rest
[4, 5, 6, 7]
5.2.2 链式赋值
x = y = somefunction 与 y = somefunction x = y等价
但不一定与x = somefunction y = somefunction等价
5.2.3 增强赋值
x = x+1 和x += 1等价,同样的适用于所有标准运算符,如/ * % - 等
5.3 代码块:缩进的乐趣
不同于其他语言,python的代码缩进是极其严格的,缩进也是代码的一部分,不可以随意缩进.
5.4 条件和条件语句
5.4.1 这正是布尔值的用武之地
用作布尔表达式时,下面的值都将被解释器视为假: False None 0 "" () {} [] 其他值都被视为真.
当然,标准真值还是True ,标准假值还是False
其实当True和False作为数值运算时,是被认为1和0的(在python 2中,就用1,0表示真假)
5.4.2 有条件地执行和if语句
if语句,能让你有条件的执行代码。这意味着当条件(if和冒号之间的部分)为真,则执行后续代码块
name = input("what's you name ")
if name.endswith("Gumby"):
print("hello ,Mr.Gumby)
str.endswith,检验字符串是否以指定字符串结束
5.4.3 else 子句
可以使用else子句增加一种选择,修改上面的代码
name = input("what's you name ")
if name.endswith("Gumby"):
print("hello ,Mr.Gumby")
else :
print("hello ,stranger")
当条件不满足时,将执行else后面的语句
python中有和c语言中的?:类似的用法
status = "friend" if name.endswith("Gumby") else "stranger"
5.4.4 elif 子句
等同于c语言中的 else if,用于检查多个条件
5.4.5 代码块嵌套
条件语句可以嵌套,注意缩进即可。继续修改上面的代码
name = input("what's you name ")
if name.endswith("Gumby"):
if name.startswith("Mr"):
print("hello ,Mr.Gumby")
elif name.startswith("Mrs"):
print("hello ,Mrs.Gumby")
else :
print("hello ,Gumby")
else :
print("hello ,stranger")
5.4.6
1.比较运算符
与c相同的: == < > <= >= !=
与赋值一样,python也支持链式比较,如 : 0<age<10 (这c真不支持)
is(is not):相同运算符,这个乍一看和==差不多,其实==是相等运算,而is要求是相同(是同一个对象),举例:
>>> x = y =[1, 4, 5]
>>> z = [1, 4, 5]
>>> x is y
True
>>> x is z
False
>>> x == y == z
True
in(not in):成员资格运算符,前面讲过了,这里就不在说明了。
关于字符串之间的比较,是按照Unicode字符码来比较的(你可以使用ord()来知道一个字符的码点),这和c中用ASCII值比较一样。
2.布尔运算符
and or not 等同于 c语言中的&& || !
同样的,也满足短路原则
5.4.7 断言
这个概念没太搞明白,后面用到再细讲吧。assert
按照我现有的理解,断言即断而言之,也即出现某种错误程序立即崩溃(总比不知道啥时候崩溃好),你可以利用这一效果来检查一些参数的值是否符合标准或者调试中使用,举例:
>>> age = 1
>>> assert 0< age <10
>>> age = -1
>>> assert 0<age<10
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
assert 0<age<10
AssertionError
书上原话:如果知道必须满足特定条件,程序才能正确的运行,可在程序中添加assert语句充当检查点,还可以在条件后面加一个字符串充当报错信息的补充说明
5.5 循环
5.5.1 while循环
直接来例子吧,,,,这个太简单了
name = ''
while not name:
name = input("name:")
print("hello ,{}".format(name))
5.5.2 for循环
首先,能用for循环,就不要用while循环。
因为经常用遍历(迭代)序列,所以:
num = [1,3,4,5,7,8]
for n in num:
print(n)
#同时,经常会需要限制范围,所以也可以这样做:
for i in range(0,6):
print(num[i])
5.5.3 迭代字典
废话不都说,直接上例子:
d = {1: 'a', 2: 'b', 3: 'c'}
for key in d: #1
print(key, '--', d[key])
for value in d.values(): #2
print(value)
for key, value in d.items(): #3
print(key, '--', value)
#1和3效果是相同的,2是只取出了值
5.5.4 一些迭代工具
1.并行迭代
当你想同时迭代两个序列时,你可以这样:
names = ['a', 'b', 'c', 'd']
ages = [1, 3, 5, 45]
for i in range(len(names)):
print(names[i], 'is', ages[i], 'years old .')
这里我们介绍一个函数zip,效果和上面相同(神奇的是zip可以缝合两个长度不一样的序列,并以短的为准)
for name, age in zip(names,ages):
print(name, 'is', age, 'years old .')
2.迭代时获取索引
内置函数:enumerate,用于在迭代对象序列的同时获取当前对象的索引。
strings = ['ab', 'cd', 'ef']
for index, string in enumerate(strings):
if 'ab' in string:
strings[index] = 'AB'
3.反向迭代和排序后再迭代
sorted:排序 reversed:反转原序列
我怎么记得前面有说过这两个函数......
5.5.2 跳出循环
1.break
当你需要跳出循环时
from math import sqrt#求小于100的最大平方数
for i in range(99, 0 , -1):
n = sqrt(i)
if n==int(n):
print(int(n))
break;
2.continue
用于结束当前迭代,并跳到下一次迭代开头。没什么可讲的......用的也不如break多。
3.while True/break成例
先让其“死循环”,再利用break,可以实现当满足一定条件时直接退出循环。
5.5.6 循环中的else子句
这个功能很有意思,也是c中没有的一种语法,在这里的else子句和普通的条件结构中的else用处不同。
这种语法要解决一种很常见的问题:循环可能是break结束或者循环正常结束,在c中我们经常设一个flag来判定(或者根据循环变量与最大值的关系),而python则很神奇的使用了else子句来实现这一功能。例子:
from math import sqrt
for i in range(99, 0 , -1):
n = sqrt(i)
if n == int(n):
print(int(n))
break;
else:
print("Don't find it")
5.6 简单推导
这个语法,emmmmm,目前感觉很容易迷,先写在这,但是不推荐用吧。
>>> [x*x for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
如果这个x还有限定条件,可以在后面加上if判断子句,如:能被3整除的100以内的平方数
>>> [x*x for x in range(10) if x % 3 == 0]
[0, 9, 36, 81]
还可以添加更多的for部分
>>> [(x,y) for x in range(3) for y in range(3)]
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
5.7 三人行
pass,del,exec
5.7.1 什么都不做
pass,直接略过,看着没什么用处,但有时当你某个部分的代码暂时没有写出来,既可以用pass来占位
5.7.2 使用del删除
python中,当某个值不再使用(没有变量指向它),系统会将其自动回收。
而使用del可以删除,但删除的是变量(相当于变量和值之间的联系被切断,但值可能还存在)
>>> x = [1, 3, 4]
>>> y = x
>>> del x
>>> y
[1, 3, 4]
5.7.3 使用exec和eval执行字符串及计算结果
如果你有一天突发奇想,想执行一个字符串或者计算式(前提是他们能够执行),你可以考虑使用exec和eval。
1.exec
>>> str = 'print("hello ")'
>>> exec(str)
hello
这就有可能引起一个问题,那就是如果你的变量/函数名 与字符串中有重复,那就麻烦了。
>>> str = 'sqrt = 1'
>>> from math import sqrt
>>> sqrt(4)
2.0
>>> exec(str)
>>> sqrt(4)
Traceback (most recent call last):
File "<pyshell#14>", line 1, in <module>
sqrt(4)
TypeError: 'int' object is not callable
为了解决这一问题,可以使用命名空间
>>> from math import sqrt
>>> scope = {}
>>> exec('sqrt = 1',scope)
>>> sqrt(4)
2.0
>>> scope['sqrt']
1
2.eval
和exec,eval用来处理计算式,也可以使用命名空间。
>>> eval(input('input :'))
input :2*4 + 5
13
ps:开学了,学习进度不出意外要加快了,从这周开始,每周两章,分别在周五晚上和周日晚上更新发布。
上一篇: 第五章 条件,循环和其他语句