函数的进阶
-
形参角度:
-
万能参数。
-
*的魔性用法。
# 万能参数。
# def eat(a,b,c,d):
# print('我请你吃:%s,%s,%s,%s' %(a,b,c,d))
#
# eat('蒸羊羔', '蒸熊掌', '蒸鹿邑','烧花鸭')def eat(a,b,c,d,e,f):
print('我请你吃:%s,%s,%s,%s,%s,%s' %(a,b,c,d,e,f))
eat('蒸羊羔', '蒸熊掌', '蒸鹿邑','烧花鸭','烧雏鸡','烧子鹅')
急需要一种形参,可以接受所有的实参。#万能参数。
万能参数: *args, 约定俗称:args,
函数定义时,*代表聚合。 他将所有的位置参数聚合成一个元组,赋值给了 args。
def eat(*args):
print(args)
print('我请你吃:%s,%s,%s,%s,%s,%s' % args)
eat('蒸羊羔', '蒸熊掌', '蒸鹿邑','烧花鸭','烧雏鸡','烧子鹅')
写一个函数:计算你传入函数的所有的数字的和。
def func(*args):
count = 0
for i in args:
count += i
return count
print(func(1,2,3,4,5,6,7))
tu1 = (1, 2, 3, 4, 5, 6, 7)
count = 0
for i in tu1:
count += i
print(count)
**kwargs
函数的定义时: ** 将所有的关键字参数聚合到一个字典中,将这个字典赋值给了kwargs.
def func(**kwargs):
print(kwargs)
func(name='alex',age=73,sex='laddyboy')
万能参数:*args, **kwargs,
def func(*args,**kwargs):
print(args)
print(kwargs)
func()
print()
* **在函数的调用时,*代表打散。
def func(*args,**kwargs):
print(args) # (1,2,3,22,33)
print(kwargs)func([1,2,3],[22,33]) # func(1,2,3,22,33)
func('fjskdfsa','fkjdsal') # func(1,2,3,22,33)
func({'name': '太白'},) #func(name='太白',age='18')
-
仅限关键字参数(了解)。
-
形参的最终顺序。
# 形参角度的参数的顺序
# args 的位置?
# def func(args,a,b,sex= '男'):
# print(a,b)
# func(1,2,3,4)
# args得到实参的前提,sex必须被覆盖了。
# def func(a,b,sex= '男',*args,):
# print(a,b)
# print(sex)
# print(args)
# func(1,2,3,4,5,6,7,)def func(a,b,*args,sex= '男'):
print(a,b)
print(sex)
print(args)
func(1,2,3,4,5,6,7,sex='女')
**kwargs 位置?
def func(a,b,*args,sex= '男',**kwargs,):
print(a,b)
print(sex)
print(args)
print(kwargs)
# func(1,2,3,4,5,6,7,sex='女',name='Alex',age=80)形参角度第四个参数:仅限关键字参数 (了解)
def func(a,b,*args,sex= '男',c,**kwargs,):
print(a,b)
print(sex)
print(args)
print(c)
print(kwargs)
# func(1,2,3,4,5,6,7,sex='女',name='Alex',age=80,c='666')形参角度最终的顺序:位置参数,*args,默认参数,仅限关键字参数,**kwargs
-
名称空间。
- 全局名称空间,局部........
局部名称空间(临时名称空间):
-
加载顺序,取值顺序。
名称空间;命名空间。
a = 1
b = 2
def func():
f = 5
print(f)
c = 3
func()内置名称空间:python源码给你提供的一些内置的函数,print input
print(666)
python分为三个空间:
内置名称空间(builtins.py)
全局名称空间(当前py文件)
局部名称空间(函数,函数执行时才开辟)
加载顺序:
内置名称空间 ---> 全局名称空间 ----> 局部名称空间(函数执行时)
def func():
pass
func()
a = 5
print(666)
python
# 加载顺序:
# 内置名称空间 ---> 全局名称空间 ----> 局部名称空间(函数执行时)
# def func():
# pass
# func()
# a = 5
# print(666)取值顺序(就近原则) 单向不可逆
LEGB原则
input = '太白金星'
def func():
# input = 'alex'
print(input)
# func()(从局部找时)局部名称空间 ---> 全局名称空间 ---> 内置名称名称空间
input = '太白金星'
def func():
input = 'alex'
func()
print(input)
-
作用域。
# 作用域:
# 两个作用域:
# 全局作用域 :内置名称空间 全局名称空间
# 局部作用域:局部名称空间局部作用域可以引用全局作用域的变量
date = '周五'
def func():
a = 666
print(date)
print(a)
func()
print(a)
局部作用域不能改变全局变量。
count = 1
# def func():
# count += 2
# print(count)
# func() # local variable 'count' referenced before assignment
局部作用域不能改变全局作用域的变量,当python解释器读取到局部作用域时,发现了你对一个变量进行修改的操作,
解释器会认为你在局部已经定义过这个局部变量了,他就从局部找这个局部变量,报错了。
使用可以,不能改变
def func():
count = 1
def inner():
print(count)
inner()
func()
def func():
count = 1
def inner():
count += 1
print(count)
inner()
func()
-
函数的嵌套(高阶函数)。
# 例1:
def func1():
print('in func1')
print(3)def func2():
print('in func2')
print(4)func1()
print(1)
func2()
print(2)
# in func1 3 1 in func2 4 2例2:
def func1():
print('in func1')
print(3)def func2():
print('in func2')
func1()
print(4)print(1)
func2()
print(2)例3:
def fun2():
print(2)def fun3():
print(6)print(4)
fun3()
print(8)print(3)
fun2()
print(5)glbals() locals()
-
内置函数 globals locals
"""
本文件:研究内置函数:globals locals
"""
a = 1
b = 2
def func():
name = 'alex'
age = 73
print(globals()) # 返回的是字典:字典里面的键值对:全局作用域的所有内容。
print(locals()) # 返回的是字典:字典里面的键值对:当前作用域的所有的内容。
# print(globals()) # 返回的是字典:字典里面的键值对:全局作用域的所有内容。
# print(locals()) # # 返回的是字典:字典里面的键值对:当前作用域的所有的内容。
func() -
关键字:nonlocal global。
-

浙公网安备 33010602011771号