1.print和import
在Python 3.0中,print不再是语句而是函数(功能基本不变)
可以使用print打印多个表达式,用逗号分隔就行
print('Age'+':',42) #Age: 42
print的参数并不能像我们预期的那样构成一个元组
对于很多应用程序来说,使用logging模块记日志比print语句更合适
import:导入功能
from math import * #从给定模块导入所有功能
print(sqrt(4)) #2.0
可以在语句末尾增加一个as子句,在该子句后给出名字,为整个模块提供别名
import math as foobar1
print(foobar1.sqrt(9)) #3.0
还可以给函数取别名
from math import sqrt as foobar2
print(foobar2(169)) #13.0
2.赋值
2.1 序列解包
允许函数返回一个以上的值并打包成元组,然后通过一个赋值语句很容易进行访问
包序列中的元素数量必须和放置在赋值符号=左边的变量数量完全一致
让多个赋值操作可以同时进行
x,y,z=1,2,3
print(x,y,z) #1 2 3
还可以用它交换两个 (或更多个)变量
x,y,z=y,x,z
print(x,y,z) #2 1 3
假设需要获取 (和删除)字典中任意的键值对,可以使用popitem方法,这个方法将键值对作为元组返回,然后这个元组就可以直接赋值到两个变量中
scoundrel={'name':'Robin','girlfriend':'Marion'}
key,value=scoundrel.popitem()
print(key+':',value) #girlfriend: Marion
Python 3.0中有另外一个解包的特性:可以像在函数的参数列表中一样使用星号运算符(将所有其他参数放在一个变量中)
使用星号的变量可以放在第一个,此时它会包含一个列表
a,b,*rest=[1,2,3,4]
print(a,b,rest) #1 2 [3, 4]
2.2 链式赋值
是将同一个值赋给多个变量的捷径
x=y=somefunction()
#等价于
y=somefunction()
x=y
2.3 增量赋值
增量赋值对其他数据类型也适用
value*=2
print(value) #MarionMarion
3.语句块:缩排的乐趣
语句块是在条件为真时执行或执行多次的一组语句
冒号用来标识语句块的开始,块中的每一个语句都是缩进的(缩进量相同)
当回退到和己经闭合的块一样的缩进量时,就表示当前块已经结束了
4.条件和条件语句
Python中所有值都能被解释为真值
false、None、0、””、[]、{}会被解释器看作假,其它的一切会被解释为真
print(bool([])) #False
if、else和elif
# name=input("What is your name?")
name="Gumby"
if name.endswith('Gumby'): #if语句
if name.startswith('Mr.'): #if语句中嵌套if语句
print('Hello,Mr.Gumby')
elif name.startswith('Mrs.'): #elif语句:else if的简写,是有条件的else语句
print('Hello,Mrs.Gumby')
else:
print('Hello,Gumby') #Hello,Gumby
else: #else语句
print('hello, stranger')
用在条件中最基本的运算符就是比较运算符
#比较运算符
x=y=[1,2,3]
z=[1,2,3]
print("x==y:",x==y) #x==y: True
print("x==z:",x==z) #x==z: True
#同一性运算符(x和y是同一个对象)
print("x is y:",x is y) #x is y: True#
print("x is z:",x is z) #x is z: False
#成员资格运算符
# name=input('What is your name?')
name="Gumby"
if 's' in name:
print('You name contains the letter "s".')
else:
print('Your name does not contains the letter "s".') #Your name does not contains the letter "s".
#布尔运算符:使用and、or和not这三个运算符可以随意结合真值
# number=int(input('Enter a number between 1 and 10:') or 9) #短路逻辑
number=9
if number <=10 and number >=1:
print('Great!') #Great!
else:
print('Wrong!')
断言assert:用于在程序中置入检查点,确保程序中的某个条件一定为真才能让程序正常工作
在检查函数参数的属性时使用,或者作为初期测试和调试过程中的辅助条件
age=10
assert 0<age<100
age=-1 #报错
assert 0<age<100,"The age must be realistic" #条件后可以添加字符串用来解释断言
5.循环
5.1 while循环
while语句非常灵活,它可以用来在任何条件为真的情况下重复执行一个代码块
x=1
while x<=5:
print(x)
x+=1
5.2 for循环
如果能使用for循环就尽量不使用while循环
for循环可以在循环中使用序列解包
d={'x':1,'y':2,'z':3}
for key,value in d.items(): # d.items:将键-值对作为元组返回
print(key,'corresponds to',value) #x corresponds to 1
# y corresponds to 2
# z corresponds to 3
5.3 一些迭代工具
并行迭代:程序可以同时迭代两个序列
names=['anne','beth','george','damon']
ages=[12,45,32,102]
for i in range(len(names)):
print(names[i],'is',ages[i],'years old.')
# anne is 12 years old.
# beth is 45 years old.
# george is 32 years old.
# damon is 102 years old.
内建的zip函数可以把多个序列压缩在一起,用来实现并行迭代
print(zip(names,ages)) #<zip object at 0x10f955048>
for i in zip(names,ages):
print(names,'is',ages,'years old.') #
# ['anne', 'beth', 'george', 'damon'] is [12, 45, 32, 102] years old.
# ['anne', 'beth', 'george', 'damon'] is [12, 45, 32, 102] years old.
# ['anne', 'beth', 'george', 'damon'] is [12, 45, 32, 102] years old.
# ['anne', 'beth', 'george', 'damon'] is [12, 45, 32, 102] years old.
编号迭代:有些时候想要迭代序列中的对象,同时还要获取当前对象的索引
可以使用内建的enumerate函数:在提供索引的地方迭代索引值对
for index,name in enumerate(names):
if 'damon' in name:
names[index]='[censored]'
for name,age in zip(names,ages):
print(name,'is',age,'years old')
# anne is 12 years old
# beth is 45 years old
# george is 32 years old
# [censored] is 102 years old
排序迭代(返回的是列表):作用于任何序列或可迭代对象上,不是原地修改对象,而是返回排序后的版本
print(sorted('Hello,world!')) #['!', ',', 'H', 'd', 'e', 'l', 'l', 'l', 'o', 'o', 'r', 'w']
翻转迭代(返回的是可迭代对象):作用于任何序列或可迭代对象上,不是原地修改对象,而是返回翻转后的版本
print(list(reversed('Hello,world!'))) #['!', 'd', 'l', 'r', 'o', 'w', ',', 'o', 'l', 'l', 'e', 'H']
5.4 跳出循环
break
:结束或跳出循环
from math import sqrt
for n in range(99,0,-1): #range(上限,下限,步长)
root=sqrt(n)
if root==int(root):
print(n) #81
break
continue
:当前迭代结束,“跳”到下一轮循环的开始
while True/break
:第一部分负责初始化,第二部分在循环条件为真的情况下使用第一部分初始化好的数据
while True:
x+=1
if(x>3):break #条件满足时结束
print(names[x])
# anne
# beth
# george
# [censored]
循环中的else语句:仅在没有调用循环内的break时执行
from math import sqrt
for n in range(99,81,-1):
root=sqrt(n)
if root==int(root):
print(n)
break
else:
print("didn't find it!") #didn't find it!
6.列表推导式——轻量级循环
列表推导式[]:利用其它列表创建新列表(类似于数学术语中的集合推导式)
print([x*x for x in range(10) if x%3==0]) #[0, 9, 36, 81]
7.pass、del和exec
pass
:可以在代码中做占位符使用
当程序需要一个if语句并进行测试,但是缺少其中一个语句块的代码时
name='Enid'
if name=='Ralph Auldus Melish':
print('Welcome!')
elif name=='Enid':
pass #表示还没完,如果不写这个,会报错,空代码块是非法的。
elif name=='Bill Gates':
print('Access Denied')
del
:不仅会移除一个对象的引用,也会移除那个名字本身,但不会删除值
x=['Hello','world']
y=x
y[1]='python'
del x
print(y) #['Hello', 'python']
exec
:执行存储在字符串中的代码(会有严重的潜在安全漏洞)
最有用的地方在于可以动态地创建代码字符串
exec("print( 'Hello world!')") #Hello world!
eval
:会计算以字符串形式书写的Python表达式,并且返回结果值
print("eval:",eval("6+18*2")) #eval: 42