Python入门笔记
Python入门笔记
Now is better than never.
Although never is often better than right now.—————The Zen of Python, by Tim Peters
1 前言
python与C++的对比
-
编译
C++ 是一种编译语言。C++ 编译器从 C++ 源代码生成目标代码,然后执行以生成输出。
Python 是一种解释型语言。扩展名为 py 的 Python 代码不需要编译。我们可以直接将其传递给 Python 解释器并生成输出。
-
语言本质
C++ 是一种静态类型语言,即在编译时验证变量的声明、变量的数据类型等。这使源代码在运行时不会出错。
另一方面,Python 不是静态类型的。在编译时没有进行类型检查。因此,代码更容易出错。
-
执行速度
就执行速度而言,C++ 程序运行得更快。事实上,C++ 广为人知并广泛用于需要运行更快的应用程序,如游戏平台。C++特别适合写渲染器之类的计算密集型程序。
另一方面,Python 运行缓慢。Python 程序运行速度比 Java 程序慢。
2 安装python
学习python的第一步是安装python的解释器,直接去官网下载就好
注意:python2.x版本与3.x版本有诸多不兼容的地方。直接学习3.x版本的特性就好。
之后需要选择一个ide/编辑器作为开发工具,我使用的是pycharm
2 Python起步
2.1 Python语法
2.1.1 缩进
在C++语言中,代码不同层次的分隔通常由大括号等来控制。例如
for (int i=1;i<=100;i++)
{
sum+=i;
sum2+=i*i;
}
上述代码等价于
for (int i=1;i<=100;i++){ sum+=i; sum2+=i*i;}
然而,在python中,函数定义、类的定义、控制语句的分层都是由缩进来进行分块的。一般行尾的":"表示下一行缩进的开始。例如
if a>b:
if a==1:
print(a)
else:
if a==0:
print(a)
else:
pass
elif a==b:
print(a,b)
else:
print(b)
以上代码中的tab不能随意删改
注意:同一级的代码的缩进量和缩进所使用的符号(tab/space)都需要保持一致。
2.1.2 注释
# 单行注释用#号
'''
多行注释用单引号或者双引号包起来
'''
2.1.3 断行
python一般不需要分号来分割语句,但是假如需要将两条语句写在同一行,那便需要分号隔开
print('+'); print('-')
假如缩进块中只有一条语句,那么可以直接写在':'之后,类似于C++省略{}的做法
if a>0:print('+')
else:print('-')
假如语句一行写不下,可以用\将剩余部分写在下一行
print('i love',\
'you')
事实上,圆括号包围的部分本身就可以写在不同行
注意:\后面不能放任何注释或者其他内容
2.2 输入/输出
2.2.1 键盘输入/输出
python的输入一般用到input()函数,基本格式如
input([prompt])
其中参数可选,可用可不用,例如
name=input('Please input your name')
注意:用户输入的数据全部会以字符串形式返回,如果需要数值则应进行类型转换
Python的输出一般用到print()函数,基本格式如
print(value1,value2,...,sep=' ',end='\n')
- value1,value2...表示print函数可以输出多个参数
- sep是多个参数之间的分隔符,默认为一个空格
- end是输出完所有信息之后添加的符号,默认为换行符
2.3 计算
2.3.1 算式与代数式计算
python在交互式命令环境下可以直接计算表达式的值,还可以预定义变量并计算代数式的值
>>>x=3
>>>2*x**2-x+4
19
另外,python标准库中提供的math模块提供许多的内置常量与函数
常量 | 描述 |
---|---|
math.e | 返回欧拉数 (2.7182...) |
math.inf | 返回正无穷大浮点数 |
math.nan | 返回一个浮点值 NaN (not a number) |
math.pi | π 一般指圆周率。 圆周率 PI (3.1415...) |
math.tau | 数学常数 τ = 6.283185...,精确到可用精度。Tau 是一个圆周常数,等于 2π,圆的周长与半径之比。 |
函数 | 描述 |
---|---|
math.acos(x) | 返回 x 的反余弦,结果范围在 0 到 pi 之间。 |
math.acosh(x) | 返回 x 的反双曲余弦值。 |
math.asin(x) | 返回 x 的反正弦值,结果范围在 -pi/2 到 pi/2 之间。 |
math.asinh(x) | 返回 x 的反双曲正弦值。 |
math.atan(x) | 返回 x 的反正切值,结果范围在 -pi/2 到 pi/2 之间。 |
math.atan2(y, x) | 返回给定的 X 及 Y 坐标值的反正切值,结果是在 -pi 和 pi 之间。 |
math.atanh(x) | 返回 x 的反双曲正切值。 |
math.ceil(x) | 将 x 向上舍入到最接近的整数 |
math.comb(n, k) | 返回不重复且无顺序地从 n 项中选择 k 项的方式总数。 |
math.copysign(x, y) | 返回一个基于 x 的绝对值和 y 的符号的浮点数。 |
math.cos() | 返回 x 弧度的余弦值。 |
math.cosh(x) | 返回 x 的双曲余弦值。 |
math.degrees(x) | 将角度 x 从弧度转换为度数。 |
math.dist(p, q) | 返回 p 与 q 两点之间的欧几里得距离,以一个坐标序列(或可迭代对象)的形式给出。 两个点必须具有相同的维度。 |
math.erf(x) | 返回一个数的误差函数 |
math.erfc(x) | 返回 x 处的互补误差函数 |
math.exp(x) | 返回 e 的 x 次幂,Ex, 其中 e = 2.718281... 是自然对数的基数。 |
math.expm1() | 返回 Ex - 1, e 的 x 次幂,Ex,其中 e = 2.718281... 是自然对数的基数。这通常比 math.e ** x 或 pow(math.e, x) 更精确。 |
math.fabs(x) | 返回 x 的绝对值。 |
math.factorial(x) | 返回 x 的阶乘。 如果 x 不是整数或为负数时则将引发 ValueError。 |
math.floor() | 将数字向下舍入到最接近的整数 |
math.fmod(x, y) | 返回 x/y 的余数 |
math.frexp(x) | 以 (m, e) 对的形式返回 x 的尾数和指数。 m 是一个浮点数, e 是一个整数,正好是 x == m * 2**e 。 如果 x 为零,则返回 (0.0, 0) ,否则返回 0.5 <= abs(m) < 1 。 |
math.fsum(iterable) | 返回可迭代对象 (元组, 数组, 列表, 等)中的元素总和,是浮点值。 |
math.gamma(x) | 返回 x 处的伽马函数值。 |
math.gcd() | 返回给定的整数参数的最大公约数。 |
math.hypot() | 返回欧几里得范数,sqrt(sum(x**2 for x in coordinates))。 这是从原点到坐标给定点的向量长度。 |
math.isclose(a,b) | 检查两个值是否彼此接近,若 a 和 b 的值比较接近则返回 True,否则返回 False。。 |
math.isfinite(x) | 判断 x 是否有限,如果 x 既不是无穷大也不是 NaN,则返回 True ,否则返回 False 。 |
math.isinf(x) | 判断 x 是否是无穷大,如果 x 是正或负无穷大,则返回 True ,否则返回 False 。 |
math.isnan() | 判断数字是否为 NaN,如果 x 是 NaN(不是数字),则返回 True ,否则返回 False 。 |
math.isqrt() | 将平方根数向下舍入到最接近的整数 |
math.ldexp(x, i) | 返回 x * (2**i) 。 这基本上是函数 math.frexp() 的反函数。 |
math.lgamma() | 返回伽玛函数在 x 绝对值的自然对数。 |
math.log(x, base) | 使用一个参数,返回 x 的自然对数(默认底为 e )。 |
math.log10(x) | 返回 x 底为 10 的对数。 |
math.log1p(x) | 返回 1+x 的自然对数(以 e 为底)。 |
math.log2(x) | 返回 x 以 2 为底的对数 |
math.perm(n, k=None) | 返回不重复且有顺序地从 n 项中选择 k 项的方式总数。 |
math.pow(x, y) | 将返回 x 的 y 次幂。 |
math.prod(iterable) | 计算可迭代对象中所有元素的积。 |
math.radians(x) | 将角度 x 从度数转换为弧度。 |
math.remainder(x, y) | 返回 IEEE 754 风格的 x 除于 y 的余数。 |
math.sin(x) | 返回 x 弧度的正弦值。 |
math.sinh(x) | 返回 x 的双曲正弦值。 |
math.sqrt(x) | 返回 x 的平方根。 |
math.tan(x) | 返回 x 弧度的正切值。 |
math.tanh(x) | 返回 x 的双曲正切值。 |
math.trunc(x) | 返回 x 截断整数的部分,即返回整数部分,删除小数部分 |
2.3.2 大整数
python内置了对大整数的支持,无需手写高精度加减乘除
3 python数据类型
3.1 简单数据类型
3.1.1 字符串(str)
python的字符串有一对单引号或者一对双引号括起来
切片:
可以通过序号取出其中某一个字符或某一段字符,截取[a:b]段字符时遵循左闭右开原则,如‘abcde’[1]取得的值为'b','abcde'[1:3]取得的值为'bc'
注意:
单引号字符串和双引号字符串本质相同,但是单引号字符串内的单引号需要转义(双引号类似),双引号字符串中的单引号则不需要(单引号字符串类似)。
另外,多行的字符串可以用三引号字符串表示
- 转义
字符串中,在符号前加'\'表示转义
- 字符串运算
python的字符串可以进行加法和乘法运算
- 字符串处理函数
Python 的字符串常用内建函数如下:
序号 | 方法及描述 |
---|---|
1 | capitalize() 将字符串的第一个字符转换为大写 |
2 | center(width, fillchar)返回一个指定的宽度 width 居中的字符串,fillchar 为填充的字符,默认为空格。 |
3 | count(str, beg= 0,end=len(string)) 返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数 |
4 | bytes.decode(encoding="utf-8", errors="strict") Python3 中没有 decode 方法,但我们可以使用 bytes 对象的 decode() 方法来解码给定的 bytes 对象,这个 bytes 对象可以由 str.encode() 来编码返回。 |
5 | encode(encoding='UTF-8',errors='strict') 以 encoding 指定的编码格式编码字符串,如果出错默认报一个ValueError 的异常,除非 errors 指定的是'ignore'或者'replace' |
6 | endswith(suffix, beg=0, end=len(string)) 检查字符串是否以 suffix 结束,如果 beg 或者 end 指定则检查指定的范围内是否以 suffix 结束,如果是,返回 True,否则返回 False。 |
7 | expandtabs(tabsize=8) 把字符串 string 中的 tab 符号转为空格,tab 符号默认的空格数是 8 。 |
8 | find(str, beg=0, end=len(string)) 检测 str 是否包含在字符串中,如果指定范围 beg 和 end ,则检查是否包含在指定范围内,如果包含返回开始的索引值,否则返回-1 |
9 | index(str, beg=0, end=len(string)) 跟find()方法一样,只不过如果str不在字符串中会报一个异常。 |
10 | isalnum() 如果字符串至少有一个字符并且所有字符都是字母或数字则返 回 True,否则返回 False |
11 | isalpha() 如果字符串至少有一个字符并且所有字符都是字母或中文字则返回 True, 否则返回 False |
12 | isdigit() 如果字符串只包含数字则返回 True 否则返回 False.. |
13 | islower() 如果字符串中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True,否则返回 False |
14 | isnumeric() 如果字符串中只包含数字字符,则返回 True,否则返回 False |
15 | isspace() 如果字符串中只包含空白,则返回 True,否则返回 False. |
16 | istitle() 如果字符串是标题化的(见 title())则返回 True,否则返回 False |
17 | isupper() 如果字符串中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True,否则返回 False |
18 | join(seq) 以指定字符串作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串 |
19 | len(string) 返回字符串长度 |
20 | [ljust(width, fillchar]) 返回一个原字符串左对齐,并使用 fillchar 填充至长度 width 的新字符串,fillchar 默认为空格。 |
21 | lower() 转换字符串中所有大写字符为小写. |
22 | lstrip() 截掉字符串左边的空格或指定字符。 |
23 | maketrans() 创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。 |
24 | max(str) 返回字符串 str 中最大的字母。 |
25 | min(str) 返回字符串 str 中最小的字母。 |
26 | [replace(old, new [, max])](https://www.runoob.com/python3/python3-string-replace.html) 把 将字符串中的 old 替换成 new,如果 max 指定,则替换不超过 max 次。 |
27 | rfind(str, beg=0,end=len(string)) 类似于 find()函数,不过是从右边开始查找. |
28 | rindex( str, beg=0, end=len(string)) 类似于 index(),不过是从右边开始. |
29 | [rjust(width,[, fillchar])](https://www.runoob.com/python3/python3-string-rjust.html) 返回一个原字符串右对齐,并使用fillchar(默认空格)填充至长度 width 的新字符串 |
30 | rstrip() 删除字符串末尾的空格或指定字符。 |
31 | split(str="", num=string.count(str)) 以 str 为分隔符截取字符串,如果 num 有指定值,则仅截取 num+1 个子字符串 |
32 | [splitlines([keepends])](https://www.runoob.com/python3/python3-string-splitlines.html) 按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表,如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。 |
33 | startswith(substr, beg=0,end=len(string)) 检查字符串是否是以指定子字符串 substr 开头,是则返回 True,否则返回 False。如果beg 和 end 指定值,则在指定范围内检查。 |
34 | [strip([chars])](https://www.runoob.com/python3/python3-string-strip.html) 在字符串上执行 lstrip()和 rstrip() |
35 | swapcase() 将字符串中大写转换为小写,小写转换为大写 |
36 | title() 返回"标题化"的字符串,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle()) |
37 | translate(table, deletechars="") 根据 table 给出的表(包含 256 个字符)转换 string 的字符, 要过滤掉的字符放到 deletechars 参数中 |
38 | upper() 转换字符串中的小写字母为大写 |
39 | zfill (width) 返回长度为 width 的字符串,原字符串右对齐,前面填充0 |
40 | isdecimal() 检查字符串是否只包含十进制字符,如果是返回 true,否则返回 false。 |
特别地,如果在字符串中希望避免出现转义字符,可以使用原始字符串,即在字符串前以r或R作为标志
注意:原始字符串不得以'\'结尾
>>>r'abc\akdd'
'abc\\akdd'
#注意到原始字符串中的\变为\\
与C++相类似,在输出时可以使用格式化字符串功能,例如
>>>print('%d+%d=%d' %(2,3,2+3))
3.1.2 python数据类型转换
隐式类型转换
在隐式类型转换中,python会自动将一种数据类型转换为另一种数据类型。例如将整数类型变量与浮点类型变量相加,整数会自动转换为浮点数以避免数据丢失
显式类型转换
在显式类型转换中,我们需要使用int()、float()、str()等预定函数来执行类型转换
以下几个内置的函数可以执行数据类型之间的转换。这些函数返回一个新的对象,表示转换的值。
函数 | 描述 |
---|---|
int(x [,base]) | 将x转换为一个整数 |
float(x) | 将x转换到一个浮点数 |
complex(real [,imag]) | 创建一个复数 |
str(x) | 将对象 x 转换为字符串 |
repr(x) | 将对象 x 转换为表达式字符串 |
eval(str) | 用来计算在字符串中的有效Python表达式,并返回一个对象 |
tuple(s) | 将序列 s 转换为一个元组 |
list(s) | 将序列 s 转换为一个列表 |
set(s) | 转换为可变集合 |
dict(d) | 创建一个字典。d 必须是一个 (key, value)元组序列。 |
frozenset(s) | 转换为不可变集合 |
chr(x) | 将一个整数转换为一个字符 |
ord(x) | 将一个字符转换为它的整数值 |
hex(x) | 将一个整数转换为一个十六进制字符串 |
oct(x) | 将一个整数转换为一个八进制字符串 |
3.2 python数据结构类型
3.2.1 列表(list)
列表是以方括号包围的数据集合,其成员可以包含任意数据类型,也可以包含另一个列表,不同成员间用逗号分隔开。
与C++的数组不同,python的列表可以包含不同类型的数据。
访问列表中的值
与字符串的索引相同,列表索引从0开始,以此类推
索引也可以从尾部开始,最后一个元素的索引为-1,往前一位为-2,以此类推
Python列表函数&方法
Python包含以下函数:
序号 | 函数 |
---|---|
1 | len(list) 列表元素个数 |
2 | max(list) 返回列表元素最大值 |
3 | min(list) 返回列表元素最小值 |
4 | list(seq) 将元组转换为列表 |
Python包含以下方法:
序号 | 方法 |
---|---|
1 | list.append(obj) 在列表末尾添加新的对象 |
2 | list.count(obj) 统计某个元素在列表中出现的次数 |
3 | list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表) |
4 | list.index(obj) 从列表中找出某个值第一个匹配项的索引位置 |
5 | list.insert(index, obj) 将对象插入列表 |
6 | list.pop([index=-1]) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值 |
7 | list.remove(obj) 移除列表中某个值的第一个匹配项 |
8 | list.reverse() 反向列表中元素 |
9 | list.sort( key=None, reverse=False) 对原列表进行排序 |
10 | list.clear() 清空列表 |
11 | list.copy() 复制列表 |
3.2.2 元组(tuple)
Python 的元组与列表类似,不同之处在于元组的元素不能修改。
元组使用小括号 ( ),列表使用方括号 [ ]。
元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。
元组中只包含一个元素时,需要在元素后面添加逗号 , ,否则括号会被当作运算符使用:
3.2.3 字典(dict)
字典类似于C++stl库中的map,建立键(key)到值(value)的映射。字典中的键必须是唯一的,但是值则不必。
字典中的每个键值对用冒号分隔,每个对之间用逗号分割,整个字典包括在花括号中,格式如下
d={key1:value1,key2:value2,key3;value3}
访问字典中的值
将相应的键放入方括号中,如下
tinydict = {'Name': 'Leason', 'Age': 18, 'Class': 'Ten'}
print ("tinydict['Name']: ", tinydict['Name'])
print ("tinydict['Age']: ", tinydict['Age'])
以上代码输出结果为
tinydict['Name']: Leason
tinydict['Age']: 18
修改字典
向字典中添加新内容的方法是增加新的键值对,如
tinydict['school']="Peking University"
修改内容的方法类似
删除单个元素的方法是使用del命令
del tinydict['school']
清空字典使用clear方法
删除字典使用del命令
Python字典包含了以下内置方法:
序号 | 函数及描述 |
---|---|
1 | dict.clear() 删除字典内所有元素 |
2 | dict.copy() 返回一个字典的浅复制 |
3 | dict.fromkeys() 创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值 |
4 | dict.get(key, default=None) 返回指定键的值,如果键不在字典中返回 default 设置的默认值 |
5 | key in dict 如果键在字典dict里返回true,否则返回false |
6 | dict.items() 以列表返回一个视图对象 |
7 | dict.keys() 返回一个视图对象 |
8 | dict.setdefault(key, default=None) 和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default |
9 | dict.update(dict2) 把字典dict2的键/值对更新到dict里 |
10 | dict.values() 返回一个视图对象 |
11 | [pop(key[,default])](https://www.runoob.com/python3/python3-att-dictionary-pop.html) 删除字典 key(键)所对应的值,返回被删除的值。 |
12 | popitem() 返回并删除字典中的最后一对键和值。 |
注意:
字典值可以是任何的 python 对象,既可以是标准的对象,也可以是用户定义的,但键不行,键必须不可变,所以可以用数字,字符串或元组充当。
3.2.4 集合(set)
集合(set)是一个无序的不重复元素序列。其中元素类型可以不同
可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
集合的操作
- 添加元素
s.add(x) #将元素 x 添加到集合 s 中,如果元素已存在,则不进行任何操作。
s.update( x ) #添加元素,且参数可以是列表,元组,字典等,x 可以有多个,用逗号分开。
- 移除元素
s.remove(x) #将元素 x 从集合 s 中移除,如果元素不存在,则会发生错误。
s.discard(x) #移除集合中的元素,且如果元素不存在,不会发生错误
s.pop() #随机删除集合中的一个元素
- 计算集合的元素个数
len(s) #计算集合 s 元素个数
- 清空集合
s.clear() #清空集合s
- 判断元素是否在集合中存在
x in s #判断元素 x 是否在集合 s 中,存在返回 True,不存在返回 False
集合内置方法完整列表
方法 | 描述 |
---|---|
add() | 为集合添加元素 |
clear() | 移除集合中的所有元素 |
copy() | 拷贝一个集合 |
difference() | 返回多个集合的差集 |
difference_update() | 移除集合中的元素,该元素在指定的集合也存在。 |
discard() | 删除集合中指定的元素 |
intersection() | 返回集合的交集 |
intersection_update() | 返回集合的交集。 |
isdisjoint() | 判断两个集合是否包含相同的元素,如果没有返回 True,否则返回 False。 |
issubset() | 判断指定集合是否为该方法参数集合的子集。 |
issuperset() | 判断该方法的参数集合是否为指定集合的子集 |
pop() | 随机移除元素 |
remove() | 移除指定元素 |
symmetric_difference() | 返回两个集合中不重复的元素集合。 |
symmetric_difference_update() | 移除当前集合中在另外一个指定集合相同的元素,并将另外一个指定集合中不同的元素插入到当前集合中。 |
union() | 返回两个集合的并集 |
update() | 给集合添加元素 |
4 Python程序结构
4.1 分支语句
if 表达式:
语句块A
else: #可省略
语句块B
if 表达式1:
语句块A
elif 表达式2:
语句块B
elif 表达式3:
语句块C
else:
语句块D
与C++极其相似,并且可以使用elif来简写else和if
4.2 循环语句
4.2.1 while语句
while 表达式:
语句块A
else: #通常不使用
语句块B
当表达式为真:
执行语句块A,并再次判断表达式
当表达式为假:
执行语句块B,不再判断表达式
4.2.2 for 语句
for语句每次循环后可自动获取新的循环变量,并检查是否超出范围
for 循环变量 in 取值范围:
语句块A
else: #通常不使用
语句块B
range()函数
range()函数用于生成整数序列,其形式如下:
range(num)
返回0~num-1的整数序列,等价于range(0,num)
range(start,end)
返回start~end-1的整数序列
range(start,end,step)
step代表序列的步长,默认为1,允许为负值
注意range()函数左闭右开
5 python函数及应用
5.1 函数的定义
def <函数名>([形式参数表]):
<执行语句>
[return <返回值>]
注意:
-
与C++不同,声明函数时不需要声明参数传入类型和函数返回类型
-
对于简单的自定义函数,可以写在一行,甚至直接返回表达式
-
可以用一个return语句返回多个值,默认为返回值为元组形式,也可以用解包形式分别接收
-
若函数没有return语句或return后无具体数值/表达式,则返回值默认为None
5.2 函数的参数传递
5.2.1 常规参数传递
- 顺序方式参数传递
调用函数时,按照声明时的原有位置顺序进行参数传递,这是最常用的
def func(x,y):
return x+y
a = 1
b = 2
print(func(a,b))
- 赋值方式参数传递
在圆括号中用“形参变量名=参数值”的赋值方式传入参数,这种方式不必按照定义函数时原有的顺序传递
def func(x,y):
return x+y
a = 1
b = 2
print(func(y = b, x = a))
- 默认方式参数传递
定义函数时同时定义默认参数,调用时,若没有传递同名或同位置参数,则会使用默认参数值
注意:
默认参数必须放在形参表的最后,其他非默认参数可以用顺序方式或者赋值方式进行传递
def func(x, y=2):
return x+y
a = 1
print(func(x = a))
5.2.2 变长参数传递
元组类型变长参数传递
在函数声明时,在某个参数名称前面加上一个星号,则表示该参数是一个元组类型的可变长形式参数
函数调用时需要以逗号分割多个数据的形式进行参数传递,函数接收多个实际参数并放入函数的一个元组内
def func(d, *dtup):
print(d)
print(dtup)
func(1,2,3,4)
也可以将外部的一个列表或元组的地址(*<变量名>的形式)作为函数的实际参数进行调用
字典类型变长参数传递
在声明函数时,在某个参数前面加两个星号,则表示该参数是一个字典类型可变长形式参数
def func(d, **ddic):
print(d)
print(ddic)
func(1,x=2,y=3)
5.2.3 函数作为参数传递
def add(x,y):
return x+y
def func(a,b,f):
return f(a,b)
a,b=1,2
print(func(a,b,add))
5.3 变量的作用域
默认情况下,全局变量在函数中是只读的
如果在函数中直接为全局变量进行赋值操作,则认为是重新定义了一个同名的局部变量
为了在函数中修改全局变量,则需要使用global关键字对变量进行声明
def func():
global x
x=2
x=1
func()
print(x)
5.4 函数的高级特性
5.4.1 推导解析式
推导解析式是一种隐含函数
例:
squares = [x**2 for x in range(10)] #0^2~9^2
<输出表达式 for 变量 in 可迭代对象 [if 条件表达式]>
可迭代对象:组合数据类型/range()函数/字典.keys()/.values()/.items()/文件
循环可以嵌套
5.4.2 匿名函数
使用lambda来创建
格式为:
lambda <形式参数列表>:<表达式>
匿名函数主体是一个表达式,不需要使用代码块
mymax = lambda x,y:x if x>=y else y
匿名函数可以直接调用,也可以赋值给函数对象名后重复调用
5.5 函数的应用
5.5.1 多条件排序
sorted(a, key=lambda x : (x[0],x[1])) #先按第0个排,相同再按第1个排
sorted(a, key=lambda x : (x[1],x[0])) #先按第1个排,相同再按第0个排
sorted(a, key=lambda x : (-x[0],x[1])) #降序、升序
5.5.2 映射
map()函数
格式:
map(变换函数名,<可迭代对象>,[<可迭代对象>,...])
map返回元素映射变换后的可迭代类型对象
list(map(float,['1','2.0','3.5'])
5.5.3 筛选
filter()函数:选择一个可迭代对象中满足条件的元素
格式:
filter(判断函数名,<可迭代对象>)
def is_even(x):return x%2==0
list(filter(is_even,[1,2,3,4,5,6]))
5.5.4 求值
eval函数:以Python表达式的方式解析并执行字符串
不支持赋值操作