一、上期知识点回顾
1、格式化输出与%百分号
print("%d%%及格" % (50))
2、字符串切片
字符串切片秘籍:只顾头来尾不管,步长为正则正向移动(从左向右),步长为负,则逆向移动(从右向左)
定义一个字符串str1 = 'abcdefg',使用切片截取字符串str1[3::-2],求返回结果:'db'
3、字典的定义
字典中的key可以是很多数据类型(不可变数据类型 => 整型、浮点型、字符串、元组)
在字典中,如果key是数字类型,如果两个值相等,则后面这个key会替换前面这个key的value值
二、Python中函数
1、函数存在的意义
① 代码重复使用
② 模块化编程(模块化编程的核心就是函数,一般是把一个系统分解为若干个功能,每个功能就是一个函数)
在编程领域,编程可以分为两大类:① 模块化编程 ② 面向对象编程
2、函数的定义
所谓的函数就是一个被命名的、独立的、完成特定功能的代码段(一段连续的代码),并可能给调用它的程序一个返回值。
被命名的:在Python中,函数大多数是有名函数(普通函数)。当然Python中也存在没有名字的函数叫做匿名函数。
独立的、完成特定功能的代码段:在实际项目开发中,定义函数前一定要先思考一下,这个函数是为了完成某个操作或某个功能而定义的。(函数的功能一定要专一)
返回值:很多函数在执行完毕后,会通过return关键字返回一个结果给调用它的位置。
基本语法:
def 函数名称([参数1, 参数2, ...]): 函数体 ... [return 返回值]
3、函数的调用
在Python中,函数和变量一样,都是先定义后使用。
# 定义函数 def 函数名称([参数1, 参数2, ...]): 函数体 ... [return 返回值] # 调用函数 函数名称(参数1, 参数2, ...)
4、函数定义的原则
函数的设计原则“高内聚、低耦合”,函数执行完毕后,应该主动把数返回给调用处,而不应该都交由print()等函数直接输出。
# 定义一个函数,拥有name参数,同时函数执行完毕后,拥有一个return返回值 def greet(name): # 执行一系列相关操作 return name + ',您好' # 调用函数 # 见到了张老师,打一声招呼 print(greet('老张')) # 见到了李老师,打一声招呼 print(greet('老李')) # 见到了王老师,打一声招呼 print(greet('老王'))
5、return返回值
当函数中需要返回多个内容时,可以直接返回一个元组。
def size(num1, num2): jia = num1 + num2 jian = num1 - num2 cheng = num1 * num2 chu = num1 / num2 return jia, jian, cheng, chu # 调用size方法 print(size(20, 5))
6、Python函数中的说明文档
① 定义函数的说明文档
def add_student():
""" 函数的说明文档:add_student方法不需要传递任何参数,其功能就是实现对通讯录的增加 操作 """
pass
② 使用help(函数名称)可以查看函数的说明。
help(函数名称)
7、函数的嵌套
函数嵌套调用指的是一个函数里面又调用了另外一个函数。
三、变量的作用域
1、什么是变量的作用域
变量作用域指的是变量的作用范围(变量在哪里可用,在哪里不可用),主要分为两类:全局作用域与局部作用域。
其实作用域的划分比较简单,在函数内部定义范围就称之为局部作用域,在函数外部(全局)定义范围就是全局作用域
# 全局作用域 def func(): # 局部作用域
2、局部变量与全局变量
在Python中,定义在函数外部的变量就称之为全局变量;定义在函数内部变量就称之为局部变量。
# 定义在函数外部的变量(全局变量) num = 10 # 定义一个函数 def func(): # 函数体代码 # 定义在函数内部的变量(局部变量) num = 100
3、变量作用域的作用范围
全局变量:在整个程序范围内都可以直接使用
str1 = 'hello' # 定义一个函数 def func(): # 在函数内部调用全局变量str1 print(f'在局部作用域中调用str1变量:{str1}') # 直接调用全局变量str1 print(f'在全局作用域中调用str1变量:{str1}') # 调用func函数 func()
局部变量:在函数的调用过程中,开始定义,函数运行过程中生效,函数执行完毕后,销毁
# 定义一个函数 def func(): # 在函数内部定义一个局部变量 num = 10 print(f'在局部作用域中调用num局部变量:{num}') # 调用func函数 func() # 在全局作用域中调用num局部变量 print(f'在全局作用域中调用num局部变量:{num}')
4、global关键字
如果有一个数据,在函数A和函数B中都要使用,可以将这个数据存储在一个全局变量里面。
这个会产生一个问题:我们能不能在局部作用域中对全局变量进行修改呢?
# 定义全局变量num = 10 num = 10 # 定义一个函数func def func(): # 尝试在局部作用域中修改全局变量 num = 20 # 调用函数func func() # 尝试访问全局变量num print(num)
最终结果:弹出10,所以由运行结果可知,在函数体内部理论上是没有办法对全局变量进行修改的,所以一定要进行修改,必须使用global
关键字。
# 定义全局变量num = 10 num = 10 # 定义一个函数func def func(): # 尝试在局部作用域中修改全局变量 global num num = 20 # 调用函数func func() # 尝试访问全局变量num print(num)
5、多函数之间数据的共享
# 定义全局变量 info = [] # 定义funcA函数:向全局变量中添加信息 def funcA(): # 使用global声明全局变量 global info # 向info全局变量中添加数据 info.append({...}) # 定义funcB函数:查询功能,需要共享全局作用域中的通讯录信息 def funcB(): # 使用global声明全局变量 global info # 共享全局作用域中的全局变量info for i in info: ...
四、函数的参数进阶
def func(参数1, 参数2, 参数3):
...
func(10, 20, 30)
1、函数的参数
在函数定义与调用时,我们可以根据自己的需求来实现参数的传递。在Python中,函数的参数一共有两种形式:① 形参 ② 实参
==形参:在函数定义时,所编写的参数就称之为形式参数==
==实参:在函数调用时,所传递的参数就称之为实际参数==
def greet(name): # name就是在函数greet定义时,所编写的参数(形参) return name + ',您好' # 调用函数 name = '老王' greet(name) # 在函数调用时,所传递的参数就是实际参数
注意:虽然我们在函数传递时,喜欢使用相同的名称作为参数名称。但是两者的作用范围是不同的。name = '老王',代表实参。其是一个全局变量,而greet(name)函数中的name实际是在函数定义时才声明的变量,所以其实一个局部变量。
2、函数的参数类型(调用)
☆ 位置参数
理论上,在函数定义时,我们可以为其定义多个参数。但是在函数调用时,我们也应该传递多个参数,正常情况,其要一一对应。
def user_info(name, age, address): print(f'我的名字{name},今年{age}岁了,家里住在{address}') # 调用函数 user_info('Tom', 23, '美国纽约')
注意事项:位置参数强调的是参数传递的位置必须一一对应,不能颠倒
☆ 关键词参数(Python特有)
函数调用,通过“键=值”形式加以指定。可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求。
def user_info(name, age, address): print(f'我的名字{name},今年{age}岁了,家里住在{address}') # 调用函数(使用关键词参数) user_info(name='Tom', age=23, address='美国纽约')
3、函数定义时缺省参数(参数默认值)
缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)。
def user_info(name, age, gender='男'): print(f'我的名字{name},今年{age}岁了,我的性别为{gender}') user_info('李林', 25) user_info('振华', 28) user_info('婉儿', 18, '女')
谨记:我们在定义缺省参数时,一定要把其写在参数列表的最后侧
4、不定长参数
不定长参数也叫可变参数。用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。此时,可用==包裹(packing)位置参数==,或者==包裹关键字参数==,来进行参数传递,会显得非常方便。
☆ 不定长元组(位置)参数
def user_info(*args): # print(args) # 元组类型数据,对传递参数有顺序要求 print(f'我的名字{args[0]},今年{args[1]}岁了,住在{args[2]}') # 调用函数,传递参数 user_info('Tom', 23, '美国纽约')
☆ 不定长字典(关键字)参数
def user_info(**kwargs): # print(kwargs) # 字典类型数据,对传递参数没有顺序要求,格式要求key = value值 print(f'我的名字{kwargs["name"]},今年{kwargs["age"]}岁了,住在{kwargs["address"]}') # 调用函数,传递参数 user_info(name='Tom', address='美国纽约', age=23)
kw = keyword + args
综上:无论是包裹位置传递还是包裹关键字传递,都是一个组包的过程。
Python组包:就是把多个数据组成元组或者字典的过程。
案例:Python中数据的传递案例
def func(*args, **kwargs): print(args) print(kwargs) # 定义一个元组(也可以是列表) tuple1 = (10, 20, 30) # 定义一个字典 dict1 = {'first': 40, 'second': 50, 'third': 60} # 需求:把元组传递给*args参数,字典传递给**kwargs # ① 如果想把元组传递给*args,必须在tuple1的前面加一个*号 # ② 如果想把字典传递给**kwargs,必须在dict1的前面加两个**号 func(*tuple1, **dict1)
五、Python拆包(元组和字典)
1、什么是拆包
Python拆包:就是把元组或字典中的数据单独的拆分出来,然后赋予给其他的变量。
拆包: 对于函数中的多个返回数据, 去掉元组, 列表 或者字典直接获取里面数据的过程。
2、元组的拆包过程
def func(): # 经过一系列操作返回一个元组 return 100, 200 # tuple元组类型的数据 # 定义两个变量接收元组中的每个数组(拆包) num1, num2 = func() # 打印num1和num2 print(num1) print(num2)
3、字典的拆包过程
记住:字典拆包,只能把每个元素的key拆出来
dict1 = {'name':'小明', 'age':18} # 拆包的过程(字典) a, b = dict1 print(a) print(b) # 获取字典中的数据 print(dict1[a]) print(dict1[b])