python基础1
课程名称 |
天数 |
目标 |
解说 |
Python核心 |
8 |
Python介绍,数据基本运算,语句,容器,函数。 |
掌握基础语法,制作简单功能。 例如:汇率转换器,BMI计算器。 |
Python面向对象 |
5 |
OOA、OOD、OOP。 |
掌握软件设计思想,设计程序架构。 例如:天龙八部技能系统,信息管理系统。 |
Python高级 |
4 |
模块和包、异常处理、迭代和生成器、函数式编程。 |
掌握 Python 程序结构,开发单机应用程序。 例如:集成操作框架。 |
阶段项目实战 |
1 |
2048游戏 |
融会贯通,深入理解 Python 语言精髓。 |
特点
特点一:弱语法,重本质
是一种弱化语言规则,注重程序原理的学习过程。 语法是表象,只有了解深层机理,才能灵活运用。 学习编程要深入内存,剖析原理,才能看清语法。 就像太极“用意不用力,先在心后在身”的道理。
特点二:重思想,重设计
思想是解决问题的思维方式,设计指编写程序结构的过程。 通过面向对象三大特征,六大原则学习设计思想。 通过信息管理系统了解 MVC 设计思想。 通过天龙八部技能系统体会设计思想。 通过“全国面向对象课程答辩”总结设计思想。
特点三:是技术,更艺术
编程是一门技术,但更是一种艺术。
写出高质量的代码(功能性、维护性,灵活性), 享受编程所带来的乐趣。
特点四:项目化,实战化
信息管理系统贯穿 Python 核心。 天龙八部技能系统贯穿面向对象。 集成操作框架贯穿 Python 高级。 2048 游戏贯穿第一阶段。
当天知识必须理解
What 是什么,即理解知识点的定义。 Why 为什么,即理解知识点的作用。 Where 在哪里,即理解知识点的适用性。 How 如何使用,即理解知识点的语法。
当天笔记必须整理
梳理当天所学内容的过程。 防止日后因为遗忘和混淆造成的麻烦。 将理论,代码,图示三合一。
python3_basic.docx
python定义
是一个免费、开源、跨平台、动态、面向对象的编程语言。
计算机只能识别机器码(1010),不能识别源代码(python)。
- 由源代码转变成机器码的过程分成两类:编译和解释。
- 编译:在程序运行之前,通过编译器将源代码变成机器码,例如:C语言。
-- 优点:运行速度快
-- 缺点:开发效率低,不能跨平台。
3.解释:在程序运行之时,通过解释器对程序逐行翻译,然后执行。例如Javascript
-- 优点:开发效率高,可以跨平台;
-- 缺点:运行速度慢。
4.python是解释型语言,但为了提高运行速度,使用了一种编译的方法。编译之后得到pyc文件,存储了字节码(特定于Python的表现形式,不是机器码)。
源代码 -- 编译 --> 字节码 -- 解释 --> 机器码
|————1次———|
解释器类型
- CPython(C语言开发)
- Jython (java开发)
- IronPython (.net开发)
pycharm常用快捷键
- 移动到本行开头:home键
- 移动到本行末尾:end键盘
- 注释代码:ctrl + /
- 复制行:ctrl +d
- 选择列:鼠标左键 + alt
- 移动行:shift + alt + 上下箭头
- 智能提示:ctrl + space
- 代码格式化:ctrl+alt+l
单行注释:# 开头 多行注释:三引号开头结尾
函数:表示一个功能 定义者是提供功能的人。 调用者是使用功能的人 print() 变量 = input() 用户输入的内容赋值给变量
变量 定义:关联一个对象的标识符 (形象比喻:一个箱子的标签)
命名:必须是字母或下划线开头。(不能是数字开头)后面跟字母数字 下划线,不能使用关键字(蓝色)字母小写。多个字母以下划线分隔class_name
赋值:创建一个变量 或者改变一个变量的关联的数据 语法:变量名=数据
del 语句 a=100 del a 用于删除变量。同时解除与对象的关联。如果可能则释放对象;
自动化内存管理的引用计数:每个对象记录被变量绑定(引用)的数量。当为0时被销毁(明白)
核心数据类型
- 在python中变量没有类型,但关联的对象有类型。
- 通过type函数可查看。
整形int
- 字面值:
十进制:5
二进制:0b开头,后跟0或者1
八进制:0o开头,后跟0~7
十六进制:0x开头,后跟0~9,A~F,a~f
小整数对象池:CPython 中整数 -5 至 256,永远存在小整数对象池中,不会被释放并可重复使用。
浮点型float
科学计数法:e/E (正负号) 指数
1.23e-2 (等同于0.0123)
1.23456e5(等同于123456.0) .2f
字符串str
用双引号 用来记录文本信息
复数complex
复数complex
由实部和虚部组成的数字。
虚部是以j或J结尾。
字面值: 1j 1+1j 1-1j
布尔bool
True 表示真 本质1 False 本质0
数据类型转换
- 转换为整形: int(数据)
- 转换为浮点型:float(数据)
转换为字符串:str(数据)
- 转换为布尔:bool(数据)
结果为False:bool(0) bool(0.0) bool(None)
- 混合类型自动升级:
1 + 2.14 返回的结果是 3.14
1 + 3.0 返回结果是: 4.0
算术运算符
/ 除法:结果为浮点数
// 地板除:除的结果去掉小数部分 整数部分
% 求余
** 幂运算
优先级从高到低: ()
**
* / % //
+ -
增强运算符
y += x 等同于 y = y + x
y -= x 等同于 y = y - x
y *= x 等同于 y = y * x
y /= x 等同于 y = y / x
y //= x 等同于 y = y // x
y %= x 等同于 y = y % x
y **= x 等同于 y = y ** x
逻辑运算符
与and
表示并且的关系,一假俱假。
False and True # False
False and False # False
或or
表示或者的关系,一真俱真
示例:
True or True # True
True or False # True
False or True # True
False or False # False
非 not
表示取反
例如:
not True # 返回False
not False # 返回True
短路运算
一但结果确定,后面的语句将不再执行。
身份运算符
语法:
x is y
x is not y
作用:
is 用于判断两个对象是否是同一个对象,是时返回True,否则返回False。
is not 的作用与is相反
选择语句
If elif else 语句
- 作用:
让程序根据条件选择性的执行语句。
if 语句的真值表达式
if 100:
print("真值")
等同于
if bool(100):
print("真值")
条件表达式
语法:变量 = 结果1 if 条件 else 结果2
作用:根据条件(True/False) 来决定返回结果1还是结果2。
循环语句
while语句
- 作用:
可以让一段代码满足条件,重复执行。
- 语法:
while 条件:
满足条件执行的语句
else:
不满足条件执行的语句
- 说明:
else子句可以省略。
在循环体内用break终止循环时,else子句不执行。
for 语句
- 作用:
用来遍历可迭代对象的数据元素。
可迭代对象是指能依次获取数据元素的对象,例如:容器类型。
- 语法:
for 变量列表 in 可迭代对象:
语句块1
else:
语句块2
- 说明:
else子句可以省略。
在循环体内用break终止循环时,else子句不执行。
range 函数
- 作用:
用来创建一个生成一系列整数的可迭代对象(也叫整数序列生成器)。
- 语法:
range(开始点,结束点,间隔)
- 说明:
函数返回的可迭代对象可以用for取出其中的元素
返回的数字不包含结束点
开始点默认为0
间隔默认值为1
跳转语句
break 语句
- 跳出循环体,后面的代码不再执行。
- 可以让while语句的else部分不执行。
continue 语句
跳过本次,继续下次循环。
容器类型
通用操作
数学运算符
- +:用于拼接两个容器
- +=:用原容器与右侧容器拼接,并重新绑定变量
- *:重复生成容器元素
- *=:用原容器生成重复元素, 并重新绑定变量
- < <= > >= == !=:依次比较两个容器中元素,一但不同则返回比较结果。
- 语法:
成员运算符
数据 in 序列
数据 not in 序列
- 作用:
如果在指定的序列中找到值,返回bool类型。
索引index
- 作用:定位单个容器元素
- 语法:容器[整数] a[1]
- 说明:
正向索引从0开始,第二个索引为1,最后一个为len(s)-1。
反向索引从-1开始,-1代表最后一个,-2代表倒数第二个,以此类推,第一个是-len(s)。a[-len(a)]
切片slice
- 作用:
定位多个容器元素。
- 语法:
容器[(开始索引):(结束索引)(:(步长))] a[2:4] a[3:8:2]
- 说明:
小括号()括起的部分代表可省略
结束索引不包含该位置元素
步长是切片每次获取完当前元素后移动的偏移量
内建函数 len() sum(X)(元素必须是数值类型)
字符串 str
定义
由一系列字符组成的不可变序列容器,存储的是字符的编码值。
编码
- 字节byte:计算机最小存储单位,等于8 位bit.
- 字符:单个的数字,文字与符号。
- 字符集(码表):存储字符与二进制序列的对应关系。
- 编码:将字符转换为对应的二进制序列的过程。
- 解码:将二进制序列转换为对应的字符的过程。
- 编码方式:
--ASCII编码:包含英文、数字等字符,每个字符1个字节。
--GBK编码:兼容ASCII编码,包含21003个中文;英文1个字节,汉字2个字节。
--Unicode字符集:国际统一编码,旧字符集每个字符2字节,新字符集4字节。
--UTF-8编码:Unicode的存储与传输方式,英文1字节,中文3字节。
相关函数
- ord(字符串):返回该字符串的Unicode码。ord('b') 98 chr(98) 'b'
- chr(整数):返回该整数对应的字符串。
单引号内的双引号不算结束符
双引号内的单引号不算结束符
- 换行会自动转换为换行符\n
- 三引号内可以包含单引号和双引号
- 。
字面值
单引和双引号的区别
三引号作用
转义字符
改变字符的原始含义 (\)
\’ \” \””” \n \\ \t \0 空字符
- 原始字符串:取消转义。 重点
a = r”C:\newfile\test.py”
In [56]: a = r'C:\newfile\test.py'
In [57]: a
Out[57]: 'C:\\newfile\\test.py'
字符串格式化
- 定义:
生成一定格式的字符串。
- 语法:
字符串%(变量)
"我的名字是%s,年龄是%s" % (name, age)
- 类型码:
%s 字符串 %d整数 %f 浮点数 %.2f
列表 list
定义
由一系列变量组成的可变序列容器。
基础操作
- 创建列表:
列表名 = []
列表名 = list(可迭代对象)
- 添加元素:
列表名.append(元素)
列表.insert(索引,元素)
- 定位元素:
列表名[索引] = 元素 修改元素
变量 = 列表名[索引]
变量 = 列表名[切片] # 赋值给变量的是切片所创建的新列表 ,明白
列表名[切片] = 容器 # 右侧必须是可迭代对象,左侧切片没有创建新列表 修改左边原有的列表
a
Out[79]: [4, 44, 4, 3, 6, 8, 88, 99]
a[2:4]=[0,0,0] 不包含结尾数字
In [81]: a
Out[81]: [4, 44, 0, 0, 0, 6, 8, 88, 99]
遍历列表:
正向:
for 变量名 in 列表名:
变量名就是元素
反向:
for 索引名 in range(len(列表名)-1,-1,-1):
列表名[索引名]就是元素
- 删除元素:
-
In [83]: del a[0]
a : [44, 0, 0, 0, 6, 8, 88, 99]
-
In [85]: a.remove(44)
a
Out[86]: [0, 0, 0, 6, 8, 88, 99]
In [87]: a.remove(0)
In [88]: a
Out[88]: [0, 0, 6, 8, 88, 99]
列表名.remove(元素)
del 列表名[索引或切片]
深拷贝和浅拷贝
浅拷贝:复制过程中,只复制一层变量,不会复制深层变量绑定的对象的复制过程。
深拷贝:复制整个依懒的变量。
列表VS字符串
- 列表和字符串都是序列,元素之间有先后顺序关系。
- 字符串是不可变的序列,列表是可变的序列。
- 字符串中每个元素只能存储字符,而列表可以存储任意类型。
- 列表和字符串都是可迭代对象。for i in 'abc': print(i) a b c
-
函数:
将多个字符串拼接为一个。
result = "连接符".join(列表) 知识点:列表转换成为字符串 result ='连接符'.join(列表)
s = ['a', 'b', 'c', 'd']
print('-'.join(s))
a-b-c-d
将一个字符串拆分为多个。
列表 = “a-b-c-d”.split(“分隔符”) 知识点:字符串转换为列表 列表=‘字符串’.split('分隔符')
xiao='xiaoliang'
In [103]: list1=xiao.split('i') In [104]: list1 Out[104]: ['x', 'aol', 'ang']
list1 = [i for i in 'abcd' if 0]
In [114]: list1
Out[114]: []
列表推导式
- 定义:
使用简易方法,将可迭代对象转换为列表。
- 语法:
变量 = [表达式 for 变量 in 可迭代对象]
变量 = [表达式 for 变量 in 可迭代对象 if 条件]
- 说明:
如果if真值表达式的布尔值为False,则可迭代对象生成的数据将被丢弃。
列表推导式嵌套
- 语法:
变量 = [表达式 for 变量1 in 可迭代对象1 for 变量2 in可迭代对象2]
- 传统写法:
result = []
for r in ["a", "b", "c"]:
for c in ["A", "B", "C"]:
result.append(r + c)
- 推导式写法:
result = [r + c for r in list01 for c in list02]
==是比较内容
is 比较 地址
list02 = list01[:] copy
list01[0]=500
list03 = list01.copy()
In [178]: list01 = ['唐僧','悟空','八戒']
In [179]: list01.append('沙僧')
In [180]: list02 = list01
In [181]: list01[0]='唐三藏'
In [182]: list02
Out[182]: ['唐三藏', '悟空', '八戒', '沙僧']
In [183]: list03 = list01.copy()
In [184]: list03
Out[184]: ['唐三藏', '悟空', '八戒', '沙僧']
In [185]: list01=[1,2]
In [186]: list.append([3,4])
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-186-c47398b1d18f> in <module>
----> 1 list.append([3,4])
TypeError: append() takes exactly one argument (0 given)
In [187]: list01.append([3,4])
In [188]: list01
Out[188]: [1, 2, [3, 4]]
In [189]: list02 = list01[:]
In [190]: list02
Out[190]: [1, 2, [3, 4]]
In [191]: list01[2][1]='三'
In [192]: list02
Out[192]: [1, 2, [3, '三']]
In [193]: list01
Out[193]: [1, 2, [3, '三']]
In [195]: list01
Out[195]: [1, 2, [3, '三']]
In [196]: list01 =['e']
In [197]: list01+=['a']
In [198]: list
Out[198]: list
In [199]: list01
Out[199]: ['e', 'a']
In [200]: name ='孙悟空‘
File "<ipython-input-200-f041e3f06535>", line 1
name ='孙悟空‘
^
SyntaxError: EOL while scanning string literal
In [201]: name ='孙悟空'
In [202]: names =['八戒']
In [203]: tuple01 =('唐僧',name,names)
In [204]: name = '齐天大圣'
In [205]: names[0] ='天蓬元帅'
In [206]: print(tuple01)
('唐僧', '孙悟空', ['天蓬元帅'])
In [207]: names = 1
In [208]: print(tuple01)
('唐僧', '孙悟空', ['天蓬元帅'])
In [209]: names
Out[209]: 1
In [184]: list03
Out[184]: ['唐三藏', '悟空', '八戒', '沙僧']
def fun02(p1,p2):
...: p1 =100
...: p2[0] ='A'
...:
In [211]: g01 =1
In [212]: g02 = ['a']
In [213]: fun02(g01,g02)
In [214]: g01
Out[214]: 1
In [215]: g02
Out[215]: ['A']
In [238]: p2[1:3]='齐天大圣孙悟空'
In [239]: p2
Out[239]: [1, '齐', '天', '大', '圣', '孙', '悟', '空', 4, 5, 6]
元组 tuple
定义
- 由一系列变量组成的不可变序列容器。
- 不可变是指一但创建,不可以再添加/删除/修改元素。
- 创建空元组:
基础操作
元组名 = () 创建空元祖
元组名 = tuple() 转换b=list(a)
- 创建非空元组:
元组名 = (20,) ⚠️ 元组一个元素的时候,一定要加逗号 否则就称为了集合
元组名 = (1, 2, 3)
元组名 = 100,200,300
元组名 = tuple(可迭代对象)
- 获取元素:
变量 = 元组名[索引] 索引,切片 都用中括号[]
变量 = 元组名[切片] # 赋值给变量的是切片所创建的新元组
In [132]: d=('a','b','m') In [133]: f=d[1:3] In [134]: f Out[134]: ('b', 'm')
- 遍历元组:
正向:
for 变量名 in 列表名:
变量名就是元素
反向:
for 索引名 in range(len(列表名)-1,-1,-1):
元组名[索引名]就是元素 与列表一样
作用
- 元组与列表都可以存储一系列变量,由于列表会预留内存空间,所以可以增加元素。
- 元组会按需分配内存,所以如果变量数量固定,建议使用元组,因为占用空间更小。
- 应用:
变量交换的本质就是创建元组:x, y = (y, x )⚠️ 这个挺重要的
In [135]: x,y = ('abc','def') In [136]: x Out[136]: 'abc' In [137]: y Out[137]: 'def'
In [138]: a
Out[138]: ((20,), 3)
In [139]: b
Out[139]: ['aA', 'aB', 'aC', 'bA', 'bB', 'bC', 'cA', 'cB', 'cC']
In [140]: x,y=(a,b)
In [141]: x
Out[141]: ((20,), 3)
In [142]: y
Out[142]: ['aA', 'aB', 'aC', 'bA', 'bB', 'bC', 'cA', 'cB', 'cC']
既可以指向容器或字符串 也可以指向变量 或者交换变量所指向的对象
格式化字符串的本质就是创建元祖:"姓名:%s, 年龄:%d" % ("tarena", 15)
字典 dict
定义
- 由一系列键值对组成的可变散列容器。
- 散列:对键进行哈希运算,确定在内存中的存储位置,每条数据存储无先后顺序。
- 键必须惟一且不可变(字符串/数字/元组),值没有限制。
- 创建字典:
基础操作
字典名 = {键1:值1,键2:值2}
字典名 = dict (可迭代对象)
- 添加/修改元素:
语法:
字典名[键] = 数据
说明:
键不存在,创建记录。
键存在,修改值。
- 获取元素:
变量 = 字典名[键] # 没有键则错误
- 遍历字典:
for 键名 in 字典名:
字典名[键名]
for 键名,值名 in 字典名.items():
语句
- 删除元素:
del 字典名[键]
对比:
列表 :a=[] a=list(可迭代对象) a.append()
元组 :a=(2,) a = tuple(可迭代对象) 不可变
字典 a={'a':'abc'} a =dict(可迭代对象)不可以 查看dict文章
a.update({'num4':'Ben'})
stu = { 'num1':'Tom', 'num2':'Lucy', 'num3':'Sam', } stu.update({'num4':'Ben'}) print(stu) #输出:{'num2': 'Lucy', 'num3': 'Sam', 'num1': 'Tom', 'num4': 'Ben'}
字典推导式
- 定义:
使用简易方法,将可迭代对象转换为字典。
- 语法:
{键:值 for 变量 in 可迭代对象}
{键:值 for 变量 in 可迭代对象 if 条件}
字典 VS 列表
- 都是可变容器。
- 获取元素方式不同,列表用索引,字典用键。
- 字典的插入,删除,修改的速度快于列表。
- 列表的存储是有序的,字典的存储是无序的。
- 由一系列键值对组成的可变散列容器。
集合 set
定义
- 由一系列不重复的不可变类型变量(元组/数/字符串)组成的可变散列容器。
- 相当于只有键没有值的字典(键则是集合的数据)。
- 创建空集合:
基础操作
集合名 = set()
集合名 = set(可迭代对象)
- 创建具有默认值集合:
集合名 = {1, 2, 3}
集合名 = set(可迭代对象)
- 添加元素:
集合名.add(元素)
- 删除元素:
集合名.discard(元素)
运算
- 交集&:返回共同元素。
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s3 = s1 & s2 # {2, 3}
- 并集:返回不重复元素
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s3 = s1 | s2 # {1, 2, 3, 4}
- 补集-:返回只属于其中之一的元素
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s1 - s2 # {1} 属于s1但不属于s2
补集^:返回不同的的元素
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s3 = s1 ^ s2 # {1, 4} 等同于(s1-s2 | s2-s1)
- 子集<:判断一个集合的所有元素是否完全在另一个集合中
- 超集>:判断一个集合是否具有另一个集合的所有元素
s1 = {1, 2, 3}
s2 = {2, 3}
s2 < s1 # True
s1 > s2 # True
- 相同或不同== !=:判断集合中的所有元素是否和另一个集合相同。
s1 = {1, 2, 3}
s2 = {3, 2, 1}
s1 == s2 # True
s1 != s2 # False
子集或相同,超集或相同 <= >=
集合推导式
- 定义:
使用简易方法,将可迭代对象转换为集合。
- 语法:
{表达式 for 变量 in 可迭代对象}
{表达式 for 变量 in 可迭代对象 if 条件}
固定集合 frozenset
定义
不可变的集合。
作用
固定集合可以作为字典的键,还可以作为集合的值。
基础操作
创建固定集合:frozenset(可迭代对象)
运算
等同于set
函数 function
pycharm相关设置
- “代码自动完成”时间延时设置
File -> Settings -> Editor -> General -> Code Completion -> Autopopup in (ms):0
- 快捷键:
Ctrl + P 参数信息(在方法中调用参数)
Ctrl + Q 快速查看文档
Ctrl + Alt + M 提取方法
定义
- 用于封装一个特定的功能,表示一个功能或者行为。
- 函数是可以重复执行的语句块, 可以重复调用。
作用
提高代码的可重用性和可维护性(代码层次结构更清晰)。
定义函数
- 语法:
def 函数名(形式参数):
函数体
- 说明:
def 关键字:全称是define,意为”定义”。
函数名:对函数体中语句的描述,规则与变量名相同。
形式参数:方法定义者要求调用者提供的信息。
函数体:完成该功能的语句。
- 函数的第一行语句建议使用文档字符串描述函数的功能与参数。
- 语法:函数名(实际参数)
- 说明:根据形参传递内容。
- 定义:
调用函数
返回值
方法定义者告诉调用者的结果。
- 语法:
return 数据
- 说明:
return后没有语句,相当于返回 None。
函数体没有return,相当于返回None。
可变/不可变类型在传参时的区别
- 不可变类型参数有:
数值型(整数,浮点数,复数)
布尔值bool
None 空值
字符串str
元组tuple
固定集合frozenset
- 可变类型参数有:
列表 list
字典 dict
集合 set
- 传参说明:
不可变类型的数据传参时,函数内部不会改变原数据的值。
可变类型的数据传参时,函数内部可以改变原数据。
函数参数
实参传递方式argument
位置传参
定义:实参与形参的位置依次对应。
序列传参
定义:实参用*将序列拆解后与形参的位置依次对应。
关键字传参
定义:实参根据形参的名字进行对应。
字典关键字传参
- 定义:实参用**将字典拆解后与形参的名字进行对应。
- 作用:配合形参的缺省参数,可以使调用者随意传参。
- 语法:
形参定义方式parameter
缺省参数
def 函数名(形参名1=默认实参1, 形参名2=默认实参2, ...):
函数体
- 说明:
缺省参数必须自右至左依次存在,如果一个参数有缺省参数,则其右侧的所有参数都必须有缺省参数。
缺省参数可以有0个或多个,甚至全部都有缺省参数。
位置形参
语法:
def 函数名(形参名1, 形参名2, ...):
函数体
星号元组形参
- 语法:
def 函数名(*元组形参名):
函数体
- 作用:
收集多余的位置传参。
- 说明:
一般命名为'args'
形参列表中最多只能有一个
命名关键字形参
- 语法:
def 函数名(*, 命名关键字形参1, 命名关键字形参2, ...):
函数体
def 函数名(*args, 命名关键字形参1, 命名关键字形参2, ...):
函数体
- 作用:
强制实参使用关键字传参
双星号字典形参
- 语法:
def 函数名(**字典形参名):
函数体
- 作用:
收集多余的关键字传参
- 说明:
一般命名为'kwargs'
形参列表中最多只能有一个
参数自左至右的顺序
位置形参 --> 星号元组形参 --> 命名关键字形参 --> 双星号字典形参
1 def fun01(func): 2 def fun02(*args,**kwargs): #形参 合并 3 print(args) #元组 4 print(kwargs) #字典 5 return func(*args,**kwargs) # 重点 实参 拆分 6 return fun02 7 8 @fun01 9 def test2(*args,**kwargs): #合 10 11 print(args) 12 print(kwargs) 13 14 test2(1,2,3,a=1,b=2) 15 # return func(args,kwargs) 相当于传进来来个集合,一个元组,个字典 被形参给合并成元组了 16 # (1, 2, 3) 17 # {'a': 1, 'b': 2} 18 # ((1, 2, 3), {'a': 1, 'b': 2}) 19 # {} 20 # return func(*args,**kwargs) 相当于将传进来的元组。 21 # (1, 2, 3) 22 # {'a': 1, 'b': 2} 23 # (1, 2, 3) 24 # {'a': 1, 'b': 2} 25 26 27 def fun03(*args): 28 print(args) 29 30 fun03(1,2,3)
作用域LEGB
- 作用域:变量起作用的范围。
- Local局部作用域:函数内部。
- Enclosing 外部嵌套作用域 :函数嵌套。
- Global全局作用域:模块(.py文件)内部。
- Builtin内置模块作用域:builtins.py文件。
- 由内到外:L -> E -> G -> B
- 在访问变量时,先查找本地变量,然后是包裹此函数外部的函数内部的变量,之后是全局变量,最后是内置变量。
- 定义在函数内部的变量(形参也是局部变量)
- 只能在函数内部使用
- 调用函数时才被创建,函数结束后自动销毁
- 定义在函数外部,模块内部的变量。
- 在整个模块(py文件)范围内访问(但函数内不能将其直接赋值)。
- 作用:
变量名的查找规则
局部变量
全局变量
global 语句
在函数内部修改全局变量。
在函数内部定义全局变量(全局声明)。
- 语法:
global 变量1, 变量2, …
- 说明
在函数内直接为全局变量赋值,视为创建新的局部变量。
不能先声明局部的变量,再用global声明为全局变量。
nonlocal 语句
- 作用:
在内层函数修改外层嵌套函数内的变量
- 语法
nonlocal 变量名1,变量名2, ...
- 说明
在被嵌套的内函数中进行使用