Python学习路程——Day11
函数参数
在使用函数参数时,一般情况下所需要遵循的规范:
越短的、越简单的、越靠前
越长的、越复杂的、越靠后
同一个形参在调用的时候不能多次赋值
1、位置参数
'''
位置形参:
函数定义阶段、括号内从左到右依次填写的变量名
语法格式:
def 函数名(a, b c):pass
注:当子代码只有一行而且很简单的情况下,可以直接在冒号后面编写,不用换行。
位置实参:
函数调用阶段括号内从左到右依次填写的数据值
语法格式:
函数名(1, 2, 3)
'''
eg:
def func(a, b):
print(a, b)
func(1, 2)
1.1位置参数所需要注意的事项:
'''
在使用实参传参的时候,要按照位置一一对应传值
实参传值的时候,既不能多一个,也不能少一个
实参没有固定的定义,可以传数据值,也可以传绑定了数据值的变量名
'''
2、关键字参数
'''
关键字传参:
通过关键字进行传参
'''
eg:
func(a = 1, b = 2)
func(1, b=2)
3、默认参数
'''
本质其实就是关键字形参
'''
eg:
def register(name, age, sex = 'man'):
print(name, age, sex)
register('Jason', '18')
4、可变长形参
用来接收多余的位置参数,组成元组赋值给*号后面变量名的 *变量名
'''
*号在形参中
用于接收多余的位置参数,组成元组赋值给*号后面的变量名
'''
eg:
def login(a, *b):
print(a, b)
login(1, 2, 3, 4, 5)
用来接收多余的关键字参数,组成字典的 **变量名
'''
**号在形参中
用于接收多余的关键字参数 组织成字典的形式赋值给**号后面的变量名
'''
eg:
def user_dict(**kwargs):
print(kwargs)
user_dict(name = 'Jason', age = '18', sex = 'woman')
接收位置参数的*号 和 接收关键字参数的**号连用
'''
在形参的定义中,有一个接收多余位置函数的 * 和一个用来接受多余关键字函数的 ** 在一起连用,会给我们提供很大的帮助,只要我们在传参数的时候遵循一定的规范,那么我们在传参的过程就不可能出错
'''
eg:
def user_dict(*args, **kwargs):
print(args, kwargs)
user_dict(1, 2, 3, 4, name = 'Jason', age = '18', sex = 'woman')
'''
输出结果为:
(1, 2, 3, 4) {'name': 'Jason', 'age': '18', 'sex': 'woman'}
'''
5、可变长实参
*号在实参中
'''
类似于for循环,将所有循环遍历出来的数据按照位置参数,一次性的传给函数
'''
eg:
def func(a, b, c):
print(a, b, c)
list_one = [11, 22, 33]
func(*list_one) # 11 22 33
tuple_one = (11, 22, 33)
func(*tuple_one) # 11 22 33
string_one = 'Tom'
func(*string_one) # T o m
set_one = {11, 22, 33}
func(*set_one) # 集合无序,随机取出里面的数值 33 11 22
dict_one = {'name': 'Jason', 'age': '18', 'sex': 'Man'}
func(*dict_one) # 只取出k键 name age sex
**在实参中
'''
将字典打散成关键字参数的形式传递给函数
'''
eg:
def user_index(name, age, sex):
print(name, age, sex)
dict_demo = {'name': 'Jason', 'age': 16, 'sex': 'man'}
user_index(**dict_demo) # Jason 16 man
user_index(name= dict_demo.get('name'),
age= dict_demo.get('age'),
sex= dict_demo.get('sex')
) # Jason 16 man
6、命名关键字参数(浅浅的了解一下就okk了)
'''
形参必须按照关键字参数传值>>>:
命名关键字参数
'''
def demo(name, *args, sex = 'man', **kwargs):
print(name, args, sex, kwargs)
demo('Jaso', 110, age = 18) # Jaso (110,) man {'age': 18}
demo('Tony', 110, 120, 'woman', sex = ' woman', age = '18')
# Tony (110, 120, 'woman') woman {'age': '18'}
名称空间与作用域
1、名称空间
'''
什么时名称空间:
名称空间就是用来存储变量名与数据值绑定关系的地方
'''
eg:
name = 'Maria' # 名称空间就是存储变量名 name 绑定 (Maria)地方
1.1 内置名称空间
'''
解释器运行自动产生,里面包含了很多的内置方法的名字
关键字、内置方法、系统内置的一些可以调用的
'''
eg:
len print input
1.2 全局名称空间
'''
Python文件运行时产生,里面存放文件级别的名字,存放的是当前py文件中(除去函数、类内部的)变量与值的对应关系以及函数名与函数的内存地址的对应关系。
'''
eg:
name = 'jason'
if name:
age = 18
while True:
sex = 'man'
def index():
pass
class MyClass(object):
pass
# name\age\gender\index\MyClass 这些都是全局变量名称
1.3 局部(临时)名称空间
'''
存放的是函数内部的变量与值的对应关系。
当一个函数被调用时,开辟临时名称空间,当函数执行结束后,临时名称空间消失。
如果一个函数被调用多次,则每调用一次,都要重新开辟临时名称空间。
'''
2、作用域
'''
两个作用域:全局作用域和局部作用域。
全局作用域:全局命名空间+内置命名空间
局部作用域:局部命名空间
存活周期
内置名称空间
python解释器启动则创建 关闭则销毁
全局名称空间
py文件执行则创建 运行结束则销毁
局部名称空间
函数体代码运行创建 函数体代码结束则销毁(类暂且不考虑)
作用域
内置名称空间
解释器级别的全局有效
全局名称空间
py文件级别的全局有效
局部名称空间
函数体代码内有效
'''
3、名字的查找顺序
'''
凡是在涉及到名字的查找的时候,首先我们要明白我们在找名字的时候,在那个空间中。
1.当我们在局部名称空间中的时候
局部名称空间 >>> 全局名称空间 >>> 内置名称空间
2.当我们在全局名称空间中的时候
全局名称空间 >>> 内置名称空间
ps:其实名字的查找顺序是可以打破的
'''
练习:
'''
判断下列money的值是多少并说明理由 思考如何修改而不是新增绑定关系
money = 100
def index():
money = 666
print(money) # 100 因为是直接打印的,没有调用函数
money = 100
def func1():
money = 666
def func2():
money = 888
func2()
print(money) # 100 直接打印的是全局的那个money
'''
标签:路程,name,Python,age,sex,Day11,空间,def,名称
From: https://www.cnblogs.com/HaiMan/p/16776155.html