Python学习路程——Day11

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
'''
posted @ 2022-10-10 16:23  负剑远游行归来仍少年  阅读(30)  评论(0)    收藏  举报