首页 > 编程语言 >Python基础之函数的参数以及名称空间

Python基础之函数的参数以及名称空间

时间:2023-05-31 17:23:09浏览次数:32  
标签:index 函数 Python age 参数 def print 实参 kevin

函数的参数

形式参数

什么是形式参数:
在'函数定义阶段'括号内依次写入的变量名就叫形式参数,简称"形参"
    	def index(a,b,c,d,e):
            pass
        # a,b就称之为是函数的形参

1、位置形参

位置形参
	在函数'定义阶段'括号内从'左往右依次'写入的'变量名'就是位置形参
    def index(a,b,c,d):
        pass
    # a,b,c,d就是位置形参

2、默认形参

# 前提是默认的形参
	在函数定义阶段就给参数赋值了
    	1. 如果你在函数调用阶段,没有给形参传值,那就是要默认的
        a = 1 
        b = 2
        def index(a,b):
        	print(a,b) #1,2
        index() 
        '''这时候就不用在实参位置为a,b赋值了'''
        2. 如果你在函数调用阶段,给形参传值了,就是要你传的值
        a = 1
        b = 2
        def index(a,b):
            print(a,b) #3,4
            index(3,4)
        '''这时候实参位置的的值就会覆盖原本的值'''
        
        3、笔试题:
        m = 200

        def func(a, b, c=m):
            print(a, b, c)

        m = 400

        func(1, 2)
        """
        两个角度理解
            角度1:
                在函数定义阶段,参数的值就已经固定死了,不能修改
            角度2:
                根据变量名和变量值在内存中关系来判断
        """

3、形参注意点

'''
位置形参必须要在默认形参前面
默认形参应该为不可变类型
默认形参的值应该是在定义阶段被定义的
'''

实际参数

在'函数调用阶段'括号内依次传入的变量值就叫实际参数,简称"实参"
    	index(1, 2, 3)
        # 1,2,3就称之为是函数的实参
"""
	形式参数和实际参数之间的关系
		把实际参数传递给形式参数,以形参=实参的形式传入----->以变量名=变量值的形式传入
		形参就相当于是变量名,实参相当于是变量值
	形参和实参在函数调用阶段临时绑定,当函数调用完毕,两者断开
"""

函数的形参形式其实只有一种,那就是变量名
函数的实参有很多中方式,但是抓住本质:就是数据值

1、位置实参

位置实参
	在函数的'调用阶段'括号内从'左往右依次'写入的'数据值'就是
位置实参
    index(1,2,3,4)
    # 1,2,3,4就是位置实参

2、关键字实参

按照关键字进行传参
例:
    def register(age=18, name='kevin', gender='female')
    register('kevin', age=18, 'female') # 不行,位置参数不能跟在关键字的后面
    register('kevin', age=18, gender='female') # 行
    register(age=18, 'kevin', gender='female') # 不行
    register('kevin', name=18, gender='female') # 不行
'''位置参数不能写在关键字的后面,越简单的参数越靠前'''

3、可变长实参

作用:
	传入的实参个数不固定,对应的就必须要有一个特殊的形参来接受溢出的值
    '''
    溢出的位置实参使用*号接收,赋值为元组
    溢出来的关键字实参使用**接收,赋值为字典
    '''

1. 不管我在调用函数的时候,传入多少个位置参数,都能正常运行
def index(name, password, x, y, *a):
    print(name, password, a, x, y)
    # print(a[0])
    # print(a[1])
    # print(a[2])


# print(a, b, c, d)
'''*号在形参中的使用:会接收多余的位置参数'''
# index('kevin', 123, 1, 2, 3, 4, 5, 6)  # kevin 123 (1, 2, 3, 4, 5, 6)
# index('kevin', 123)  # kevin 123 ()
# index('kevin', 123, 3, 4, 5, 6, 7, y=2, x=1, )  # kevin 123 () 1 2
# index('kevin', 123, y=2, x=1, 3, 4, 5, 6, 7, )  # kevin 123 () 1 2

2. 不管我们在调用函数的时候,传入多少个关键字参数,都能正常运行
"""
**号在形参中的使用:
    接收多余的关键字参数
"""
def index(username, age, gender, hobby, **a):
    print(username, age, gender, a )# kevin 18 {'gender': 'male', 'hobby': 'read', 'a': 1, 'b': 2, 'c': 3}
    # {'hobby': 'read', 'a': 1, 'b': 2, 'c': 3}

# index(1,2)
# index(a=1,b=2)
# 关键字传参就是指名道姓的传递
# index(b=1,a=1)

d = {'username': 'kevin', 'age': 18}
# index(username='kevin', age=18)# 可行
# index(d.get('username'), d.get('age'))# 可行
# index(username=d.get('username'), age=d.get('age')) # 可行
# index(username=d.get('username'), age=d.get('age'),gender='male', hobby='read',a=1,b=2,c=3)
index(username=d.get('username'), age=d.get('age'),gender='male', hobby='read',a=1,b=2,c=3)
3. 不管我传入多少个位置参数和关键字参数,函数都能正常运行
def index(*a, **b):
    print(a, b)

# (1, 2, 3)  {'x': 1, 'y': 2, 'z': 3, 'm': 10, 'n': 20}
index(1, 2, 3, 4, k=10, x=1, y=2, z=3, m=10, n=20, )

"""
注意:
    *号和**号后面的变量可以任意起名,遵循变量的命名即可
    在python中,推荐使用
        *args: arguments  位置参数
        **kwargs: keyword arguments 关键字参数
    以后在定义函数的时候,如果我们不知道要传递多少个参数,我们就可以如下定义
        def index(*args, **kwargs):
            pass
"""

# *号和**号在实参中的使用

def index(*args):
    print(args)


# index(1,2,3,4,)

# l = [1, 2, 3, 4, 5, 6, 7, 8, 9, ]
t = (1, 2, 3, 4, 5, 6, 7, 8, 9, )
# index(l[0], l[1], l[2], l[4], l[4],)  # index(1,2,3,4,5)

'''
*在实参中的使用,就是把列表、元组中的一个一个元素打散,然后以位置参数的形式传递
'''
# 针对列表这种里面肯能存放多个元素的时候,我们利用*打散成一个个的元素
# *l 就把列表中的元素,挨个打散
# index(*l)  # (1, 2, 3, 4, 5, 6, 7, 8, 9)-----------> index(1,2,3,4,5,6,7,8,9)
index(*t)  # (1, 2, 3, 4, 5, 6, 7, 8, 9)-----------> index(1,2,3,4,5,6,7,8,9)



"""
**号在实参中的使用:把字典打散成关键字的形式进行传递
"""
def func(**kwargs):
    print(kwargs)  # {'username': 'kevin', 'age': 18, 'gender': 'male'}\
    # print(kwargs.get('username'))
    # print(kwargs.get('age'))
    # print(kwargs.get('gender'))


# func(username='kevin', age=18, gender='male')

d = {'a':1, 'b':2, 'c':3, 'd':4,'e':5}

# func(a=d.get('a'), b=d.get('b'))

# func(a=1,b=2,c=3,d=4,e=5)
func(**d)  # {'a': 1, 'b': 2, 'c': 3, 'd': 4}

名称空间

什么是名称空间?
	就是绑定变量名与变量值关系的地方
名称空间的分类:
	1. 内置名称空间
    	# python内置的,可以直接拿来使用的, len,print
    2. 全局名称空间
    	# 在py文件中,顶格写的变量都是在全局名称空间中
        name ='jason' # name就是全局变量,它就在全局名称空间中存着

        if True:
            a = 123  # a也在全局变量,它也在全局名称空间中存储

        for i in range(10): # i 也是全局变量,它也在全局的名称空间中存储
            pass

        def func(): # func 也是全局的,它也在全局的名称空间中存储
            pass		
    3. 局部名称空间
    	# 在函数中存在的都是局部的
    print(locals())  # {'a': 123, 'b': 'hello'}
    print(globals())

名字的查找顺序

   # len = 'helloworld'

# print(len) # helloworld

name = 'tank'

def index():
    # name = 'kevin'
    print(name)

index()
"""
名字的查找:
    先看你自己再哪个位置
        全局  >>>  内置
    先看你自己再哪个位置
        局部   >>>   全局    >>> 内置
"""

x = 111


def func():
    # x = 222

    def func1():
        # x = 333

        def func2():
            # x = 444

            def func3():
                # x = 555
                print(x)

            func3()

        func2()

    func1()


func()

"""验证变量的查找顺序:局部 >>> 全局 >>> 内置"""

标签:index,函数,Python,age,参数,def,print,实参,kevin
From: https://www.cnblogs.com/chao0308/p/17435676.html

相关文章

  • Python基础之装饰器
    装饰器1、为什么要用装饰器1.1、为程序提供扩展功能的可能性1.2、要遵循开放封闭原则1.3、禁止修改原代码,但是可以新增功能1.4、也不能修改调用方式2、什么是装饰器2.1为被装饰对象添加新功能的工具2.2、不修改被装饰对象源代码和调用方式3、装饰器的核心思想3......
  • Python之作用域
    作用域、函数对象和闭包作用域1、全局作用域内置名称空间+全局名称空间全局存货全局有效2、局部作用域局部名称空间局部存活局部有效3、global关键字作用: 声明全局变量###########################global"""在函数的内部不能直接修改外部的变量......
  • python基础15
    递归函数什么是递归函数递归就是直接或者间接调用自己的函数就是递归函数1#练习题2l=[1,[2,[3,[4,[5,[6,[7,[8]]]]]]]34defindex(l):5foriinl:6iftype(i)isint:7print(i)8else:9index(i)算法之......
  • 快速排序 分区函数
    适合我的快排分区函数:defpatition2(arr,l,r):pivot=arr[l]index=l+1foriinrange(l+1,r+1):ifarr[i]<pivot:arr[i],arr[index]=arr[index],arr[i]index+=1arr[l],arr[index-1]=arr[index-1],arr[l]......
  • python版本的“共轭梯度法”算法代码
    在看代码的过程中遇到了共轭梯度法这个概念,对这个算法的数学解释看过几遍,推导看过了,感觉懂了,然后过上一些日子就又忘记了,然后又看了一遍推导,然后过了一些日子也就又忘记了,最后想想这个算法的数学解释就不要再取深究了,毕竟平时也不太会用到,偶尔用到了只要保证代码会写也就OK了。 ......
  • 概率生成函数
    概率生成函数认识概率生成函数,形如\[f(x)=\sum_{i=0}^{+\infty}P(X=i)x^i\]也就是 i 次项的系数是随机变量 X 等于 i 的概率。这个东西有两个用处:1关于概率\(f(1)=1\)其实就是把 \(f(x)\) 的所有系数加起来,而这里的系数就是概率2关于期望想一想,上面的......
  • UE4中的蓝图函数库
    #蓝图函数库此文为AssertionsBlueprintFunctionLibraries(opensnewwindow)的原创翻译,本文内容版权归原文所有,仅供学习,如需转载望注本文地址,翻译不易,谢谢理解我们在开发中经常发现需要一系列工具函数来让开发更简单。这些函数经常是无状态的,并且在各种gameplay框架代码中......
  • 编译器绕过拷贝构造函数和返回值优化
    写在前面:在拷贝初始化(也就是用等号初始化,注意使用拷贝构造函数创建一个新的对象不属于拷贝初始化)过程中,编译器可以(但不是必须)跳过拷贝构造函数或者移动构造函数,直接创建对象。1stringnull_book="999";2//可以改写为3stringnull_book("999");这里面”999“隐式的转换为......
  • 使用python操作hdfs,并grep想要的数据
    代码如下:importsubprocessfordayinrange(24,30):forhinrange(0,24):filename="tls-metadata-2018-10-%02d-%02d.txt"%(day,h)cmd="hdfsdfs-text/data/2018/10/%02d/%02d/*.snappy"%(day,h)print(c......
  • python cassandra 创建space table并写入和查询数据
     fromcassandra.clusterimportClustercluster=Cluster(["10.178.209.161"])session=cluster.connect()keyspacename="demo_space"session.execute("createkeyspace%swithreplication={'class':'SimpleStrategy&......