一、昨天内容回顾
1、函数的参数
1)实参角度:位置参数、关键字参数、混合参数
2)形参角度:位置参数、默认参数、仅限关键字参数,万能参数
3)形参角度参数顺序:位置参数,*args,默认参数,仅限关键字参数,**kwargs
2、*的魔性用法:
1)函数的定义时:代表聚合
2)函数的调用时:代表打散
3、python中存在的三个空间:
内置名称空间:存储的内置函数:print, input.....
全局名称空间:py文件,存放的是py文件(除去函数,类内部的)的变量,函数名与函数的内存地址的关系
局部名称空间:存放的函数内部的变量与值的对应关系
4、加载顺序:内置名称空间------->全局名称空间------>局部名称空间(执行函数时候)
5、调取顺序:就近原则。 局部名称空间------>全局名称空间----->内置名称空间
1) 局部作用域只能引用全局变量,不能修改。
6、作用域:
1)全局作用域 :内置名称空间+全局名称空间
2)局部作用域:局部名称空间
二、作业:
1、看代码写结果
def func():
return 1, 2, 3
val = func()
print(val)
print(type(val) == tuple)
print(type(val) == list)
# 输出结果:True False
2、看代码写结果
def func(*args, **kwargs):
print(args)
print(kwargs)
# a. 请将执行函数,并实现让args的值为 (1,2,3,4)
func(1, 2, 3, 4)
func(*[1,2,3,4])
# b. 请将执行函数,并实现让args的值为 ([1,2,3,4],[11,22,33])
func([1,2,3,4],[11,22,33])
# c. 请将执行函数,并实现让args的值为 ([11,22],33) 且 kwargs的值为{'k1':'v1','k2':'v2'}
func([11,22],33,k1='v1',k2='v2')
# d. 如执行 func(*{'武沛齐','金鑫','女神'}),请问 args和kwargs的值分别是?
func(*{'武沛齐','金鑫','女神'})
# e. 如执行 func({'武沛齐','金鑫','女神'},[11,22,33]),请问 args和kwargs的值分别是?
func({'武沛齐','金鑫','女神'},[11,22,33])
# f. 如执行 func('武沛齐','金鑫','女神',[11,22,33],**{'k1':'栈'}),请问 args和kwargs的值分别是?
func('武沛齐','金鑫','女神',[11,22,33],**{'k1':'栈'})
3、看代码写结果
def func(name,age=19,email='123.qq.com'):
print(name,age,email)
#a执行func('mrxiong'),判断是否可执行,请可以访问name、age、email的值分别是什么?
func('mrxiong')
#b执行func('mrxiong',20),判断是否可执行,请可以访问name、age、email的值分别是什么?
func('mrxiong',20)
#c执行func('mrxiong',20,30),判断是否可执行,请可以访问name、age、email的值分别是什么?
func('mrxiong',20,50)
#d执行func('mrxiong,email='x@qq.com'),断是否可执行,请可以访问name、age、email的值分别是什么?
func('mrxiong',email='x@qq.com')
#e执行func('mrxiong,email='x@qq.com',age=99),断是否可执行,请可以访问name、age、email的值分别是什么?
func('mrxiong',email='x@qq.com',age=99)
#f执行func(name='mrxiong',99),断是否可执行,请可以访问name、age、email的值分别是什么?
func(name='mrxiong',99)
#g执行func(name='mrxiong',99,'111@qq.com'),断是否可执行,请可以访问name、age、email的值分别是什么?
func(name='mrxiong',99,'111@qq.com')
4、看代码写结果
def func(users,name):
users.append(name)
return users
result = func(['mrxiong','张三'],'alex')
print(result)
#返回结果:
#['mrxiong', '张三', 'alex']
5、看代码写结果
def func(users,name):
users.append(name)
return users
result = func(['mrxiong','张三'],'alex')
print(result)
输出结果:
['mrxiong', '张三', 'alex']
6、看代码写结果
a = 10
b = 20
def test(a,b):
return a ,b
c = test(b,a)
print(c)
输出结果:
(20, 10)
7、看代码写结果
def a(*args):
count = 0
for i in args:
count += i
return count
c = a(1,2,3,4,5)
print(c)
输出结果:
15
三、补坑(默认参数的坑,作用域的坑)
1、如果你的默认参数指向的是可变的数据类型,那么你无论调用多少次这个默认参数,都是指向同一个
def func(a,list=[]):
list.append(a)
return list
print(func(10,))
print(func(20,))
输出结果:
[10]
[10, 20]
2、在函数中,如果你定义了一个变量,但是在定义这个变量之前对其引用了,那么解释器认为语法问题。
你应该在使用之前先定义
count = 1
def func():
print(count)
count = 3
func()
输出结果:
UnboundLocalError: local variable 'count' referenced before assignment
3、global 全局
1)、在局部作用域 声明一个全局变量
name = 'alex'
def func():
global name
name = 'mrxiong'
print(name)
func()
print(name)
输出结果:
alex
mrxiong
2)可以修改一个全局变量
count = 1
def func1():
global count
count += 1
print(count)
func1()
print(count)
输出结果:
1
2
4、nonlocal
不能够操作全局于变量。局部作用域,内层函数对外层函数的局部变量进行修改
def wrapper():
count = 1
def inner():
nonlocal count
count += 1
print(count)
inner()
wrapper()
输出结果:
1