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)。

 

  1. 由源代码转变成机器码的过程分成两类:编译和解释。
  2. 编译:在程序运行之,通过编译器将源代码变成机器码,例如:C语言。

-- 优点:运行速度快

-- 缺点:开发效率低,不能跨平台

      3.解释:在程序运行之,通过解释器对程序逐行翻译,然后执行。例如Javascript

-- 优点:开发效率高,可以跨平台;

-- 缺点:运行速度慢。

  4.python是解释型语言,但为了提高运行速度,使用了一种编译的方法。编译之后得到pyc文件,存储了字节码(特定于Python的表现形式,不是机器码)。

源代码 -- 编译 --> 字节码 -- 解释 --> 机器码

|————1次———|

解释器类型

  1. CPython(C语言开发)
  2. Jython (java开发)
  3. IronPython (.net开发)

pycharm常用快捷键

  1. 移动到本行开头:home键
  2. 移动到本行末尾:end键盘
  3. 注释代码:ctrl + /
  4. 复制行:ctrl +d
  5. 选择列:鼠标左键 + alt
  6. 移动行:shift + alt + 上下箭头
  7. 智能提示:ctrl + space
  8. 代码格式化:ctrl+alt+l

单行注释:# 开头   多行注释:三引号开头结尾

函数:表示一个功能   定义者是提供功能的人。 调用者是使用功能的人 print()   变量 = input() 用户输入的内容赋值给变量

变量  定义:关联一个对象的标识符  (形象比喻:一个箱子的标签

  命名:必须是字母或下划线开头。(不能是数字开头)后面跟字母数字 下划线,不能使用关键字(蓝色)字母小写。多个字母以下划线分隔class_name

  赋值:创建一个变量 或者改变一个变量的关联的数据  语法:变量名=数据

del 语句   a=100 del a 用于删除变量。同时解除与对象的关联。如果可能则释放对象;

  自动化内存管理的引用计数:每个对象记录被变量绑定(引用)的数量。当为0时被销毁(明白)

核心数据类

  1. python中变量没有类型但关联的对象有类型。
  2. 通过type函数可查看。

整形int

  1. 字面值:

  十进制: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

数据类型转换

  1. 转换为整形: int(数据)
  2. 转换为浮点型:float(数据)

  转换为字符串:str(数据)

  1. 转换为布尔:bool(数据)

       结果为False:bool(0)  bool(0.0)  bool(None)  

  1. 混合类型自动升级:

    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 语句

  1. 作用:

     让程序根据条件选择性的执行语句。

if 语句的真值表达式

if 100:

        print("真值")

等同于

if bool(100):

    print("真值")

条件表达式

  语法:变量 = 结果1 if 条件 else 结果2

  作用根据条件(True/False) 来决定返回结果1还是结果2。

 

循环语句

while语句

  1. 作用

以让一段代码满足条件,重复执行

  1. 语法:

while 条件:

        满足条件执行的语句

    else:

        不满足条件执行的语句

  1. 说明:

    else子句可以省略。

    在循环内用break终止循环时,else子句不执行

 

for 语句

  1. 作用:

    用来遍历可迭代对象的数据元素

可迭代对象是指能依次获取数据元素的对象,例如:容器类型。

  1. 语法:

    for 变量列表 in 可迭代对象:

        语句块1

    else:

        语句块2

  1. 说明:

    else子句可以省略。

    在循环内用break终止循环时,else子句不执行

range 函数

  1. 作用:

     用来创建一个生成一系列整数的可迭代对象(也叫整数序列生成器)。

  1. 语法:

    range(开始点,结束点,间隔)

  1. 说明:

函数返回的可迭代对象可以用for取出其中的元素

返回的数字不包含结束点

开始点默认为0

间隔默认值为1 

跳转语句

break 语句

  1. 跳出循环体,后面的代码不再执行。
  2. 可以让while语句的else部分不执行

continue 语句

跳过本次,继续下次循环

 

容器类型

通用操作

数学运算符

  1. +:用于拼接两个容器
  2. +=:用原容器与右侧容器拼接,并重新绑定变量
  3. *:重复生成容器元素
  4. *=:用原容器生成重复元素, 并重新绑定变量
  5. < <= > >= == !=:依次比较两个容器中元素,一但不同则返回比较结果。 
  6. 语法:

成员运算符

 数据 in 序列

数据 not in 序列

  1. 作用:

   如果在指定的序列中找到值,返回bool类型。

索引index

  1. 作用:定位单个容器元素
  2. 语法:容器[整数] a[1]
  3. 说明:

正向索引从0开始,第二个索引为1,最后一个为len(s)-1。

反向索引从-1开始,-1代表最后一个,-2代表倒数第二个,以此类推,第一个是-len(s)。a[-len(a)]

切片slice

  1. 作用:

定位多个容器元素

  1. 语法:

容器[(开始索引):(结束索引)(:(步长))]       a[2:4]    a[3:8:2]

  1. 说明:

小括号()括起的部分代表可省略

结束索引不包含该位置元素

步长是切片每次获取完当前元素后移动的偏移量

内建函数  len() sum(X)(元素必须是数值类型)

字符串 str  

定义

由一系列字符组成的不可变序列容器,存储的是字符编码值

编码

  1. 字节byte:计算机最小存储单位,等于bit.
  2. 字符:单个的数字,文字与符号。
  3. 字符集(码表):存储字符与二进制序列的对应关系。
  4. 编码:将字符转换为对应的二进制序列的过程。
  5. 解码:将二进制序列转换为对应的字符的过程。
  6. 编码方式:

--ASCII编码:包含英文、数字等字符,每个字符1个字节

  --GBK编码:兼容ASCII编码,包含21003个中文英文1个字节,汉字2个字节

  --Unicode字符集:国际统一编码,旧字符集每个字符2字节,新字符集4字节。

  --UTF-8编码Unicode的存储与传输方式,英文1字节,中文3字节

相关函数

  1. ord(字符串):返回该字符串Unicode码。ord('b') 98   chr(98) 'b'
  2. chr(整数):返回该整数对应的字符串。

  单引号内的双引号不算结束符

  双引号内的单引号不算结束符

  1. 换行会自动转换为换行符\n
  2. 三引号内可以包含单引号和双引号

字面值

单引和双引号的区别

三引号作用

转义字符

改变字符的原始含义  (\)

\’  \”  \”””  \n  \\  \t  \0 空字符  

  1. 原始字符串:取消转义。 重点

a = r”C:\newfile\test.py”

 

In [56]: a = r'C:\newfile\test.py'                                              

 

 In [57]: a                                                                      

 

Out[57]: 'C:\\newfile\\test.py'

 

 

 

字符串格式化

  1. 定义:

生成一定格式的字符串。

  1. 语法:

字符串%(变量)

"我的名字是%s,年龄是%s" % (name, age)

  1. 类型码:

%s 字符串     %d整数     %f 浮点数   %.2f

列表 list

定义

由一系列变量组成的可变序列容器。

基础操作

  1. 创建列表:

列表名 = []   

列表名 = list(可迭代对象)

  1. 添加元素:

列表.append(元素) 

列表.insert(索引,元素)

  1. 定位元素:

列表名[索引] = 元素  修改元素

变量 = 列表名[索引]  

变量 = 列表名[切片] # 赋值给变量的是切片所创建的新列表   ,明白

列表名[切片] = 容器 # 右侧必须是可迭代对象,左侧切片没有创建新列表   修改左边原有的列表

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):

列表名[索引名]就是元素

  1. 删除元素:
  2. In [83]: del a[0]                                                               

    a : [44, 0, 0, 0, 6, 8, 88, 99]

  3. 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字符串

  1. 列表和字符串都是序列,元素之间有先后顺序关系。
  2. 字符串是不可变的序列,列表是可变的序列。
  3. 字符串中每个元素只能存储字符,而列表可以存储任意类型
  4. 列表和字符串都是可迭代对象。for i in 'abc': print(i)  a  b   c
  5. 函数:

将多个字符串拼接为一个。

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]: []


 

列表推导式

  1. 定义:

使用简易方法,将可迭代对象转换为列表。

  1. 语法:

变量 = [表达式 for 变量 in 可迭代对象]

变量 = [表达式 for 变量 in 可迭代对象 if 条件]

  1. 说明:

如果if真值表达式的布尔值为False,则可迭代对象生成的数据将被丢弃。

列表推导式嵌套

  1. 语法:

变量 = [表达式 for 变量1 in 可迭代对象1 for 变量2 in可迭代对象2]

  1. 传统写法:

result = []

for r in  ["a", "b", "c"]:

    for c in ["A", "B", "C"]:

        result.append(r + c)

  1. 推导式写法:

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

定义

  1. 由一系列变量组成的不可变序列容器。 
  2. 不可变是指一但创建,不可以再添加/删除/修改元素。    
  3. 创建空元组:

基础操作

元组名 = ()  创建空元祖

元组名 = tuple()  转换b=list(a)

  1. 创建非空元组:

元组名 = (20,)   ⚠️ 元组一个元素的时候,一定要加逗号  否则就称为了集合

    元组名 = (1, 2, 3)

元组名 = 100,200,300

元组名 = tuple(可迭代对象)

  1. 获取元素:  

变量 = 元组[索引]    索引,切片 都用中括号[]

变量 = 元组[切片] # 赋值给变量的是切片所创建的新元组  

In [132]: d=('a','b','m')                                                       

In [133]: f=d[1:3]                                                              

In [134]: f                                                                     
Out[134]: ('b', 'm')

 

  1. 遍历元组:

正向:

for 变量名 in 列表名:

变量名就是元素

反向:

for 索引名 in range(len(列表名)-1,-1,-1):

元组[索引名]就是元素      与列表一样

作用

  1. 元组与列表都可以存储一系列变量,由于列表会预留内存空间,所以可以增加元素
  2. 元组会按需分配内存,所以如果变量数量固定,建议使用元组,因为占用空间更小。
  3. 应用:

变量交换的本质就是创建元组: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. 由一系列键值对组成的可变散列容器
  2. 散列:对键进行哈希运算,确定在内存中的存储位置,每条数据存储无先后顺序
  3. 键必须惟一且不可变(字符串/数字/元),值没有限制。
  4. 创建字典:

基础操作

字典名 = {键1:值1,键2:值2}

字典名 = dict (可迭代对象

  1. 添加/修改元素:

语法:

    字典名[键] = 数据

说明:

    键不存在,创建记录。

    键存在,修改值。

  1. 获取元素:

变量 = 字典名[键]  # 没有键则错误

  1. 遍历字典:

for 键名 in 字典名:

字典名[键名]

for 键名,值名 in 字典名.items():

语句

  1. 删除元素:

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'}

 

字典推导式

  1. 定义:

使用简易方法,将可迭代对象转换为字典

  1. 语法:

{键:值 for 变量 in 可迭代对象}

    {键:值 for 变量 in 可迭代对象 if 条件}

字典 VS 列表

  1. 都是可变容器。
  2. 获取元素方式不同,列表用索引,字典用键
  3. 字典的插入,删除,修改的速度快于列表
  4. 列表的存储是有序的,字典的存储是无序的
  5. 由一系列键值对组成可变散列容器

集合 set

定义

 

  1. 由一系列不重复的不可变类型变量(元组/数/字符串)组成的可变散列容器。
  2. 相当于只有键没有值的字典(键则是集合的数据)。
  3. 创建空集合: 

基础操作

集合名 = set()  

集合名 = set(可迭代对象)

  1. 创建具有默认值集合:

集合名 = {1, 2, 3}

集合名 = set(可迭代对象)

  1. 添加元素:

集合名.add(元素)

  1. 删除元素:

集合名.discard(元素)

运算

  1. 交集&:返回共同元素。

s1 = {1, 2, 3}

s2 = {2, 3, 4}

  s3 = s1 & s2  # {2, 3}

 

  1. 并集:返回不重复元素

s1 = {1, 2, 3}

   s2 = {2, 3, 4}

   s3 = s1 | s2  # {1, 2, 3, 4}

 

  1. 补集-:返回只属于其中之一的元素

   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)

 

  1. 子集<:判断一个集合的所有元素是否完全在另一个集合中
  2. 超集>:判断一个集合是否具有另一个集合的所有元素

   s1 = {1, 2, 3}

   s2 = {2, 3}

s2 < s1  # True

   s1 > s2  # True

 

  1. 相同或不同== !=:判断集合中的所有元素是否和另一个集合相同。

  s1 = {1, 2, 3}

   s2 = {3, 2, 1}

   s1 == s2  # True

   s1 != s2  # False

子集或相同,超集或相同 <=  >= 

集合推导式

  1. 定义:

使用简易方法,将可迭代对象转换为集合。

  1. 语法:

{表达式 for 变量 in 可迭代对象}

     {表达式 for 变量 in 可迭代对象 if 条件}

固定集合 frozenset

定义

不可变的集合。

作用

固定集合可以作为字典的键,还可以作为集合的值。

基础操作

创建固定集合:frozenset(可迭代对象)

运算

等同于set

函数 function

pycharm相关设置

  1. “代码自动完成”时间延时设置

File -> Settings -> Editor -> General -> Code Completion -> Autopopup in (ms):0

  1. 快捷键:

Ctrl + P 参数信息(在方法中调用参数)

Ctrl + Q 快速查看文档

Ctrl + Alt + M 提取方法

定义

  1. 用于封装一个特定的功能,表示一个功能或者行为。
  2. 函数是可以重复执行的语句块, 可以重复调用。

作用

提高代码的可重用性和可维护性(代码层次结构更清晰)。

定义函数

  1. 语法:

def 函数名(形式参数):

     函数体

  1. 说明:

def 关键字:全称是define,意为”定义”。

函数名:对函数体中语句的描述,规则与变量名相同。

形式参数:方法定义者要求调用者提供的信息。

函数体:完成该功能的语句。

  1. 函数的第一行语句建议使用文档字符串描述函数的功能与参数。
    1. 语法:函数名(实际参数) 
    2. 说明:根据形参传递内容。
    3. 定义:

调用函数

返回值

方法定义者告诉调用者的结果。

  1. 语法:

return 数据 

  1. 说明:

return后没有语句,相当于返回 None。

函数体没有return,相当于返回None。

可变/不可变类型在传参时的区别

  1. 不可变类型参数有:

数值型(整数,浮点数,复数)

布尔值bool

None 空值

字符串str

元组tuple

固定集合frozenset

  1. 可变类型参数有:

列表 list

字典 dict

集合 set

  1. 传参说明:

不可变类型的数据传参时,函数内部不会改变原数据的值。

可变类型的数据传参时,函数内部可以改变原数据。

函数参数

实参传递方式argument

位置传参

定义:实参与形参的位置依次对应。

序列传参

定义:实参*将序列拆解后与形参的位置依次对应。

关键字传参

定义:实参根据形参的名字进行对应。

字典关键字传参
  1. 定义:实参用**将字典拆解后与形参的名字进行对应。
  2. 作用:配合形参的缺省参数,可以使调用者随意传参。
  3. 语法:

形参定义方式parameter

缺省参数

def 函数名(形参名1=默认实参1, 形参名2=默认实参2, ...):

      函数体

  1. 说明:

缺省参数必须自右至左依次存在,如果一个参数有缺省参数,则其右侧的所有参数都必须有缺省参数。

缺省参数可以有0个或多个,甚至全部都有缺省参数。

位置形参

语法:

def 函数名(形参名1, 形参名2, ...):

函数体

星号元组形参
  1. 语法:

def 函数名(*元组形参名):

  函数体

  1. 作用:

收集多余的位置传参。

  1. 说明:

一般命名为'args'

形参列表中最多只能有一个

命名关键字形参

  1. 语法:

def 函数名(*, 命名关键字形参1, 命名关键字形参2, ...):

函数体

def 函数名(*args, 命名关键字形参1, 命名关键字形参2, ...):
            函数体

  1. 作用:

强制实参使用关键字传参

双星号字典形参
  1. 语法:

def 函数名(**字典形参名):

函数体

  1. 作用:

收集多余的关键字传参

  1. 说明:

一般命名为'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)
View Code

 

作用域LEGB

  1. 作用域:变量起作用的范围。
  2. Local局部作用域:函数内部。
  3. Enclosing  外部嵌套作用域 :函数嵌套。 
  4. Global全局作用域:模块(.py文件)内部。 
  5. Builtin内置模块作用域builtins.py文件。
  6. 由内到外:L -> E -> G -> B
  7. 在访问变量时,先查找本地变量,然后是包裹此函数外部的函数内部的变量,之后是全局变量,最后是内置变量。
  8. 定义在函数内部的变量(形参也是局部变量)
  9. 只能在函数内部使用
  10. 调用函数时才被创建,函数结束后自动销毁
  11. 定义在函数外部,模块内部的变量。
  12. 在整个模块(py文件)范围内访问(但函数内不能将其直接赋值)。
  13. 作用:

变量名的查找规则

局部变量

全局变量

global 语句

在函数内部修改全局变量。

在函数内部定义全局变量(全局声明)。

  1. 语法:

global 变量1, 变量2, …

  1. 说明

在函数内直接为全局变量赋值,视为创建新的局部变量。

不能先声明局部的变量,再用global声明为全局变量。

nonlocal 语句

  1. 作用:

在内层函数修改外层嵌套函数内的变量

  1. 语法

nonlocal 变量名1,变量名2, ...

  1. 说明

在被嵌套的内函数中进行使用

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2020-05-17 09:21  晓亮86  阅读(202)  评论(0编辑  收藏  举报