python——函数

Posted 郭东东郭

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python——函数相关的知识,希望对你有一定的参考价值。

1.关于函数参数:默认参数、关键参数、非固定参数

(1)默认参数

def stu_register(name, age, country=‘China‘):
    print(‘注册信息‘.center(30, ‘-‘))
    print(‘姓名:‘, name)
    print(‘年龄:‘, age)
    print(‘国籍:‘, country)


stu_register(‘李白‘, 40)
stu_register(‘李白‘, 40, ‘大唐‘)

country=‘China‘ 为默认参数,默认参数必须放在默认参数后面才符合语法要求,调用函数的时候默认参数可以不传,如果传的话则以传入的参数为准

(2)关键参数

正常情况下,给函数传参是按顺序传,不想按顺序传,就可以用关键参数,即传参时候指定参数名。

关键参数必须要放在位置参数之后。

def stu_register(name, age, country=‘China‘):
    print(‘注册信息‘.center(30, ‘-‘))
    print(‘姓名:‘, name)
    print(‘年龄:‘, age)
    print(‘国籍:‘, country)


stu_register(‘小钻风‘, country=‘赛博坦‘, age=25) 
stu_register(‘奇异博士‘, country=‘赛博坦‘, 25) # 这种方式是错误的 

(3)非固定参数

在定义函数时不确定会传入多少个参数,可以使用非固定参数

def fun1(*args):
    print(args)


fun1(‘李白‘, 22, ‘诗人‘)
fun1(‘鸣人‘, 25, ‘螺旋丸‘, ‘雏田‘, ‘疾风传‘)
#打印结果:
#(‘李白‘, 22, ‘诗人‘)
#(‘鸣人‘, 25, ‘螺旋丸‘, ‘雏田‘, ‘疾风传‘)

**kwargs 多传入的参数变成一个dict形式

def fun2(name, age, *args, **kwargs):  # *kwargs 会把多传入的参数变成一个dict形式
    print(name, age, args, kwargs)


fun2(‘我爱罗‘, 30)
fun2(‘卡卡西‘, 35, ‘千鸟‘, ‘神威‘, ‘写轮眼‘, students=‘鸣人、佐助、小樱‘, teacher=‘木叶闪光‘)
#打印结果:
#我爱罗 30 () {}
#卡卡西 35 (‘千鸟‘, ‘神威‘, ‘写轮眼‘) {‘students‘: ‘鸣人、佐助、小樱‘, ‘teacher‘: ‘木叶闪光‘}

2.局部变量

name = "大白"
def change_name():
    name = "小黑"
    print(‘函数内部打印:‘, name)

change_name()
print(‘函数外部打印:‘, name)

#打印结果:
#函数内部打印: 小黑
#函数外部打印: 大白

结论:定义在函数外部一级代码的变量,即全局变量,全局可用,定义在函数内部的变量,即内部变量,只能在局部使用。

如果全局变量和局部变量都有一个变量叫 name,函数使用时查找变量的顺序是就近原则,由内到外

另外,python中,无法通过这种方式更改全局变量 name 的值

如何在函数中修改全局变量

name = ‘李白‘

def fun():
    global name #global name的作用就是要在函数里声明全局变量name ,意味着最上面的name = "Alex Li"即使不写,程序最后面的print也可以打印name
    name = ‘杜甫‘
    print(‘函数内部:‘, name)

fun()
print(‘函数外部:‘, name)
#打印结果:
#函数内部: 杜甫
#函数外部: 杜甫

另外补充一个小尾巴:

names = [‘鸣人‘, ‘佐助‘, ‘小樱‘]

def change():
    names[0] = ‘六代目火影‘
    print(‘函数内:‘, names)

change()
print(‘函数外:‘, names)
#打印结果:
#函数内: [‘六代目火影‘, ‘佐助‘, ‘小樱‘]
#函数外: [‘六代目火影‘, ‘佐助‘, ‘小樱‘]
#内容被改了,因为列表里面存的是内存地址,是可以修改的,类似于,元祖本身不可修改,但是元祖中包含的列表内容是可以修改的。

列表、字典、集合、对象是可以修改的,包括包含列表等类型的元祖。不可修改的有字符串、数字、布尔


3.函数嵌套

  • 函数内部可以再定义函数,所有函数只要执行必须先调用
def fun1():
    print(‘鸣人‘)
    def fun2():
        print(‘博人‘)
    fun2() #fun2 只能在 fun2函数定义后才可以调用
    
fun1() #fun2 只能在 fun1 中调用,在fun1 外面无法调用
#鸣人
#博人

4.作用域

#python 中 函数就是一个作用域
age = 18
def fun1():
    age = 73
    def fun2():
        print(age)

    return fun2


print(fun1())  # 打印结果:(函数地址)<function fun1.<locals>.fun2 at 0x00000000027A8AE8>
val = fun1()
val()  # 打印结果:73  此处打印的部署18,是73,说明代码定义完成后,作用域已生成,作用域链向上查找。

此处打印的部署18,是73,说明代码定义完成后,作用域已生成,作用域链向上查找。

而不是:把fun2函数返回后,在外面调用,就变成全局的了,内部函数依然在内部执行。


5.匿名函数

不需要使用 def 来定义一个函数,直接使用lambda来创建,不能访问自有参数列表之外或全局命名空间的参数。

f = lambda x, y:x * y  # 声明一个匿名函数
print(f(2,3)) # 6

以上代码 :前面的 x,y是参数 , : 后面的是返回内容

  • 匿名函数可以与其他函数搭配使用,如filter、map等
  • 程序一次性使用、不需要定义函数名时,匿名函数可以节省内存中变量定义的空间
  • 一般有一行表达式,必须有返回值,但不能有return
  • 可以没有参数,也可以有多个参数,允许参数存在默认值
#无参匿名函数
>>> f = lambda:True
>>> f()
True

#带参匿名函数
lambda x: x**3 #一个参数
lambda x,y,z:x+y+z #多个参数
lambda x,y=3: x*y #允许参数存在默认值


>>> c = lambda x,y=2: x+y #使用了默认值
>>> c(10) #如果不输入,就使用默认值2
12

再举个栗子:

data = range(10)
print(list(map(lambda x:x*2, data))) #打印结果: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

map(func, *iterables) , map会把data中的每个数当做参数,传入 该匿名函数,然后返回,最终会返回一个列表,我们用list() 强制转换一下,转换之前打印出的是 列表的地址。

以上是关于python——函数的主要内容,如果未能解决你的问题,请参考以下文章

python使用上下文对代码片段进行计时,非装饰器

python 元组有用的函数,方法和片段。

Python代码阅读(第26篇):将列表映射成字典

VSCode自定义代码片段——声明函数

Python学习 :函数

VSCode自定义代码片段8——声明函数