导入模块
import modu
import modu1,modu2,...
from modu import func1
from modu import func1,func2,func3,...
from modu import *
为导入的模块或函数起别名
import math as mymath
from math import fabs as aa, sqrt as bb
赋值魔法:
序列解包:
多个复制操作同时进行:x,y,z = 1,2,3
交换两个或更多变量:x,y = y,x
序列解包:sequence unpacking--将多个值的序列解开,然后放到变量的序列中,当函数或方法返回元组(或其他序列或可迭代对象)时,这个特性尤其有用。
它允许函数返回一个以上的值并且打包成元组,然后通过一个赋值语句很容易访问。
放置在赋值=号左边的变量个数必须与所解包的序列中的元素数量完全一致。
py3中新增了另一个解包特性:可以像函数在参数列表中一样使用星号运算符。
a,b,*rest = [1,2,3,4] ==> a = 1,b = 2,x = [3,4]
星号*代表将所有其他的元素都收集到rest中
链式赋值:
x = y = 5 ===> x = 5,y = 5
x,y是对用一个值的引用,互不干扰
增量赋值:
x += 1 ===> x = x + 1
对于+-*/%等标准运算符都适用
对于其他类型的数据也适用,只要二元运算符本身适用于这些数据类型
x = 'abc'
x *= 2 ===> 'abcabc'
增量赋值可以使代码更加紧凑简练。
语句块:缩排的乐趣
语句块是在条件为真(条件语句)时执行,或者执行多次(循环语句)的一组语句。
在代码前放置空格来缩进语句即可创建语句块。
块中的每行都应该缩进相同的量。
很多语言使用特殊单词或字符({)来表示一个语句块的开始,用另外的单词或字符(})表示语句块的结束。
在python中,用冒号(:)来标识语句块的开始,块中的每一个语句都是缩进的(缩进量相同)。
当回退到和已经闭合的块一样的缩进量时,就表示当前块已经结束了。
条件和条件语句:
1.布尔变量的作用
2.条件执行和if语句
3.else子句
4.elif子句
5.嵌套代码块
6.更复杂的条件
1.比较运算符
==,>,<,>=,<=,!=,is,is not,in,not in
只有在比较两个相同或近似类型的对象,比较才有意义。
在py3中,比较不兼容类型的对象已经不再可行。
在python中,比较运算和赋值运算一样是可以连接的: 0<age<100
2.相等运算符:判断两个值是否相等
3.同一性运算符is:是否为同一个对象(id相同)
4.成员资格运算符in
5.字符串和序列比较:
相同索引的元素进行比较
字符串可以按照字母排列顺序比较A<Z<a<z
6.布尔运算符(逻辑运算符):and or not
短路逻辑(惰性求值):避免了无用的执行代码,可以作为一种技巧使用。
name = input('').strip() or 'unknown'
这类短路逻辑可以用来实现三元运算符的作用:
a if b else c
如果b为真,返回a,否则返回b
断言(assert):
断言的工作方式有点像if的变形:
if not condition:
print(1111)
在我们调试代码或者初期测试时,与其在程序在晚些时候崩溃,不如在错误条件出现时直接让它崩溃。
如果需要确保程序中的某个条件一定为真才能让程序正常工作的话,assert语句就有用了。它可以在程序中设置检查点。
age = input('请输入年龄').strip()
assert 0<int(age)<150#在age不满足条件时直接报错
条件后可以添加字符串,用来解释断言。
assert 0<int(age)<150,'年纪大了'
循环:为了在条件为真时,使代码重复执行多次。
1.while循环:在任何条件为真的情况下重复执行一个代码块
2.for循环:为一个可迭代对象的每一个元素都执行一个代码块
3.循环遍历字典元素:
for key in dict
for key in dict.keys()
for val in dict.values()
for k,v in dict.items()
4.一些迭代工具:
1.并行迭代
程序可以同时迭代两个序列:
names = ['egon','alex','mxt']
ages = [18,19,20]
for i in range(len(ages)):
print(names[i],ages[i])
内置函数zip可以用来进行并行迭代,可以把多个序列压缩在一起,返回一个元祖的列表。zip可以应付不等长的序列,当最短序列用完时就会停止。
list(zip(names,ages)) == [('egon', 18), ('alex', 19), ('mxt', 20)]
2.编号迭代
有时想要迭代序列中的对象,还要获取当前对象的索引。
for x,y in enumerate(list):
print(x,y)
3.翻转和排序迭代
reversed,sorted这两个内置函数,等同于列表的reverse和sort,但是可以作用于任何序列和可迭代对象上,不是修改原对象,且返回翻转或排序后的副本。
跳出循环:
1.break:跳出本层循环
2.continue:跳出本次循环(跳过剩余的循环体,但不结束循环)
pass
什么都没有发生,在代码中做占位符使用
del
一般来说,python会删除那些不再使用的对象(因为使用者不会再通过任何变量和数据结构引用它们)。
python的垃圾回收机制:python解释器会删除在内存中引用计数为0的值
del语句会移除一个对象的引用和那个名字本身。
exec+eval执行和求值字符串:
有时可能会需要动态地创造python代码,然后将其作为语句执行或作为表达式计算。
使用exec或eval可以执行存储在字符串中的python代码
1.exec()
exec('print(123)')
exec函数可以执行存储在字符串中的python代码,但也可能会干扰命名空间。
from math import sqrt
exec 'sqrt = 5'
print(sqrt(4))
很多情况下,需要给它提供命名空间,使它不会干扰已有的变量。
exec函数最有用的地方在于可以动态的创建代码字符串。
如果字符串是从其他地方获得的,比如用户输入,那么几乎不能确定其中包含什么代码。
为了安全起见,可以增加一个字典,起到命名空间的作用。
from math import sqrt
dd = {}
exec 'sqrt=1' in dic
sqrt(4)
2.eval()
eval(用于求值)是类似exec的内建函数。
exec会执行一系列python语句。
eval会计算python表达式,并且返回结果值。
总结:
1.打印:print也已打印由逗号隔开的多个值。参数有sep和end
2.导入:import module
import fun from module as xx
3.赋值:通过序列解包和链式赋值功能,多个变量可以一次性赋值。
增量赋值可以原地改变变量。
4.块:块是通过缩排语句组成的一种方法。他们可以在条件和循环语句中使用。
5.条件:条件语句/布尔表达式
if/elif/else
三元表达式: a if x==1 else b
6.断言:assert 简单来说就是肯定某事为真。如果条件为假,断言会让程序报错。
7.循环:可以为序列中的每一个元素执行一段语句块。
continue跳出本次循环;break跳出本层循环。
8.列表推导式:它不是真正的语句--是看起来像循环的表达式。
可以基于已有列表根据各种条件生成新的列表。
9.pass,del,exec,eval
涉及到的函数:
chr(n):当传入序号n时,返回一个字符(0<=n<256)
eval(source[,globals[,locals]]):将字符串作为表达式计算,并返回结果
enumerate(seq[,start]):产生用于迭代的(索引,值)对
ord(c):返回单个字符的int值
range(start,end,step):类似于列表切片,返回一个包含整数的序列
reversed(seq):产生seq的反向版本,用于迭代
sorted(seq,key,reverse):返回seq排序后的列表
zip(seq1,seq2,...):创造用于并行迭代的心序列