Python语法复习

Python语法复习

enumerate()函数

for i, v in enumerate(['tic','tac','toe']):
    print(i,v)

将得到结果:

0	tic

1	tac

2 	toe

循环中的break,continue 语句和else 子句

for 循环语句支持else子句,for循环中,可迭代对象中的元素全部循环完毕时,或while 循环的条件为假的时候,执行该语句;break语句中止循环时,不执行该语句。

>>> for n in range(2,10):
...		for x in range(2,n):
...			if n % x == 0:
...				print(n,'equals',x,'*',n//x)
...				break
...		else:
...			print(n,'is a prime number')

结果是:

2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3

pass语句

pass语句不执行任何操作。语法上需要一个语句,但程序不实际执行任何动作时,可以使用该语句。

while True:
	pass

函数定义的特殊参数

默认情况下,函数参数可按位置或关键字传递给python函数,python中提供了限制参数传递方式的方法,以方便的确认参数项是仅按位置、按位置或关键字,还是仅按关键字传递。函数定义如下:

def f(pos1,pos2,/,pos_or_kwd,*,kwd1,kwd2)

/*是可选的,这些符号表明如何把参数值传递给形参。

/之前为仅限位置形参,之后为其它形参(位置或关键字、仅关键字)。

*之后为仅限关键字。

如何决定哪些形参可以用于函数定义

  • 使用仅限位置形参,可以让用户无法使用形参名。形参名没有实际意义时,强制调用函数的实参顺序时,或同时接受位置参数和关键字时,这种方法很有用。例如如果已经仅限使用位置参数,那么在字典中可以使用与位置参数同名的键。
  • 当形参名有实际意义时,且显式名称可以让函数定义更容易理解时,阻止用户以来传递实参的位置时,才使用关键字。
  • 对于API,使用仅限位置形参,可以防止未来修改形参名时造成破坏性的API变动。

任意实参列表

调用函数时,使用任意数量的实参不常用,这些实参包含在元组中,在可变数量的实参前,可能有若干个普通参数;在可变数量的实参后,只能用关键字传递参数。例如:

>>>	def contace(*args,sep="/"):
>>>		return sep.join(args)

>>>	contact("earth","mars","venus",sep=".")
'earth.mars.venus'

队列和堆栈

堆栈

遵循“后进先出”原则,使用list.append()和list.pop(),无需指定索引。

队列

队列遵循“先进先出”原则,但是列表实现队列效率较低,因为在列表手添加元素所有元素都要后移一位。

通常使用collections.deque实现队列

from collections import deque
queue = deque(["Eric","John","Michael"])
queue.append("Terry")
queue.append("Graham")
queue.popleft()
queue.popleft()
queue

输出结果:

deque(['Michael','Terry','Graham'])

列表推导式

列表推导式的方括号内包含以下内容:一个表达式,后面为一个for语句,然后是零个或多个for或if子句。结果是由表达式依据for和if子句求值而得出一个新列表。例如:

>>> [(x,y) for x in [1,2,3] for y in [3,1,4] if x!=y]
[(1,3),(1,4),(2,3),(2,1),(2,4),(3,1),(3,4)]

等价于:

combs = []
for x in [1,2,3]:
    for y in [3,1,4]:
        if x!=y:
            combs.append((x,y))
combs

注意当列表元素为元组时,必须加上括号,否则会报错。

注意下面这个实用的例子:

vec = [[1,2,3],[4,5,6],[7,8,9]]
[num for elem in vec for num in elem]

输出结果:

[1,2,3,4,5,6,7,8,9]

嵌套的列表推导式

  • 用嵌套列表表达式求矩阵的转置
matrix = [
	[1, 2, 3, 4],
	[5, 6, 7, 8],
	[9, 10, 11, 12]
]
[[row[i] for row in matrix] for i in range(3)]

输出结果:

[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
  • 用内置函数求矩阵的转置
list(zip(*matrix))

注意matrix前的,是zip()函数需要独立的列表参数,而matrix中将他们“融合”了,需要用*进行“解包”*

元组和序列的补充知识

  • 创建一个元素的元组,可以这样操作:
singleton = 'hello',

这样就会得到长度为1的元组,如果不加逗号,会得到一个字符串。

  • 元组可以打包和解包
 t = 12345, 54321, 'hello'

解包:

x, y, z = t

实际上可以对任何序列类型变量进行这种操作,可以称之为“序列解包”,适用于右侧的任何序列。

序列解包时,左侧变量与右侧变量的元素数量应该相等。多重赋值实际上是元组打包和序列解包的组合。

集合

  • 集合只能通过set()建立空集合

  • 与列表推导式类似,集合也支持推导式

    a = {x for x in 'abracadabra' if x not in 'abc'}
    

    输出结果:

    {'r','d'}
    

字典

  • dict()构造式可直接用键值对序列构造字典

    dict([('sape',4139),('guido',4127),('jack',4098)])
    

    结果为:

    {'sape':4139,'guido':4127,'jack',4098}
    
  • 字典推导式可以用任意键值表达式创建字典

    {x:x**2 for x in (2, 4, 6)}
    

    结果为:

    {2:4, 4:16, 6:36}
    
  • 关键字是比较简单的字符串时,直接用关键字参数制定键值对

    dict(sape=4136,guido=4127,jack=4098)
    

    结果为:

    {'sape':4139, 'guido':4127, 'jack'=4098}
    

循环的技巧

  1. 字典中循环时,用items()方法可以同时取出键和对应的值。
  2. 在序列中循环时,用enumerate()函数可同时去除位置索引和对应的值。
  3. 同时循环2个或多个序列时,用zip()函数可将其中的元素一一匹配。
  4. 逆向循环序列时,先正向定位序列,然后调用reversed()函数。
  5. 按制定顺序循环序列,可用sorted()函数,在不改动原序列的基础上,返回一个重新的序列。
  6. 使用set()去除序列中的重复元素。使用sorted()和set()则按排序后的顺序,循环遍历中的唯一元素。
  7. 一般在循环中修改列表的内容时,创建新列表比较安全。

深入条件控制

比较操作符:> < ==

布尔运算符: and, or, not

其中布尔运算符的优先级低于比较运算符,比较运算符中not的优先级最高,or的优先级最低。因此, A and not B or C等价于(A and (not B)) or C.

布尔运算符notor也被称为短路运算符:其参数从左向右解析,一旦可以确定结果,解析就会停止。例如如果AC为真,B为假,那么A and B and C不会解析C

序列类型和其它类型比较

序列对象可以同相同序列类型的其他对象比较,这种比较使用字典式顺序。

首先比较前两个对应元素,如果不相等,则可确定比较结果;如果相等,则比较之后的两个元素,以此类推,直到其中一个序列结束。

如果要比较的两个元素式相同类型的序列,则递归的执行字典式顺序比较。如果两个序列中所有的对应元素都相等,那么两个序列相等。

如果两个序列中所有的对应元素都相等,则两个序列相等,如果一个序列是另一个序列的初始子序列,则较短的序列可被视为较小的序列。

字符串的比较使用Unicode码位序号排序单个字符。

注意:对于不同类型的对象,只要待比较的对象提供了合适的比较方法,就可以用<>比较,不能比较则会触发TypeError异常。

使用json保存结构化数据

json(JavaScript Object Notation),存在两个过程:

将数据改写为字符串表示形式,称为序列化serializing。

从字符串中重建数据称为解序化deserializing。

  1. 查看某个对象的json字符串表现形式

    import json
    x = [1, 'simple', 'list']
    json.dumps(x)
    

    输出结果:

    '[1, "simpe", "list"]'
    

多版本python的使用

在windows和linux下可安装多版本的python,不会相互覆盖。

  1. 启动相应版本的python,例如同时安装python3.10和python3.7。

​ 在命令行键入:

 python3.7

python3.10

即可。

  1. 为不同版本的python安装扩展包
 python3.7 -m pip install [包名称]

即在pip命令前添加版本号和-m命令即可安装到对应版本的python。不添加该命令则会安装到默认python版本下。

Python虚拟环境的创建和使用

直接在真实环境中安装python会造成环境之间的污染,因此需要创建虚拟环境,原则上每一个项目都有属于自己的虚拟环境。

不同项目所需要的环境不同,每次启动仅需要在对应虚拟环境中启动,可提高运行效率。

创建虚拟环境
Linux/macos
  1. 在期望的地方创建Virtual目录(文件夹)并切换到该目录下

    mkdir -p path/dirname
    cd path/dir
    
  2. 创建虚拟环境

    python3.7 -m venv test.env
    

    这里使用已安装的任意python版本(这里是python3.7),如直接使用python则使用默认版本。

Windows
  1. 在期望的地方创建虚拟环境目录

  2. 在创建的文件夹中打开命令提示符(Alt+D,再键入cmd,即进入当前目录的命令行界面)

  3. 创建虚拟环境

    python3.7 -m venv test.env 
    
启动虚拟环境
macos/Linux
source ~/Virtual/test.env/bin/activate
Windows
test.env\Scripts\activate.bat
虚拟环境的使用
确认安装情况

如果出现和以下提示符类似的提示,说明安装成功(Windows):

(test.env) C:\My Program\EnvPy\myenv1\Scripts>
安装扩展包

激活虚拟环境后,直接运行pip相关命令即可,无需对使用的python版本进行说明(例如键入python3.7)命令,将自动运行安装虚拟环境时采用的版本。

虚拟环境中的安装、卸载、升级不会影响到主环境。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值