首页 > 其他分享 >函数进阶

函数进阶

时间:2023-05-23 16:24:02浏览次数:31  
标签:func1 进阶 作用域 空间 print def 函数

函数进阶

函数的动态参数(万能参数)*args **kwargs

为了扩展,对于传入的实参数量不固定,而创建的

*args 用法

在函数定义的时候,*args 聚合,即将所有实参的位置参数聚合到一个元组上,并将这个元组赋值给args.

def fuc1(a,*args):
    print(a)
    print(args)
fuc1(1,2,3,4,5,6,7)        #1      (2, 3, 4, 5, 6, 7)   

在函数定义的时候,**kwargs 聚合成字典,即将实参所有的关键字参数聚合成一个字典的键值对

def func1(a,**kwargs):
    print(a)
    print(kwargs)
func1(a = "taibai",num = "alex",age = 18,sex = "男")
#taibai
#{'num': 'alex', 'age': 18, 'sex': '男'}

在函数定义的时候,**kwargs 聚合成字典,即将实参所有的关键字参数聚合成一个字典的键值对

def func1(a,**kwargs):
    print(a)
    print(kwargs)
func1(a = "taibai",num = "alex",age = 18,sex = "男")
#taibai
#{'num': 'alex', 'age': 18, 'sex': '男'}

* 的魔性用法

在函数定义时,在位置后表示聚合

在函数执行时,在位置后表示打散(方便理解)

l1 = [1,2,3]
l2 = [111,22,33,'alex']
def func1(*args):
    print(args)
func1(*l1,*l2)  #(1, 2, 3, 111, 22, 33, 'alex') 可以理解为先打散后再在函数内进行聚合成一个元组#同理,**字典也可以这样打散后再聚合

形参位置优先级

  位置参数在最左边,其后为*args,其次为默认参数,最后为**kwargs,一般来说只存在一两个进行运算,几乎不存在四个全都在的情况

名称空间

我们首先回忆一下Python代码运行的时候遇到函数是怎么做的,从Python解释器开始执行之后,就在内存中开辟里一个空间,每当遇到一个变量的时候,就把变量名和值之间对应的关系记录下来,但是当遇到函数定义的时候,解释器只是象征性的将函数名读如内存,表示知道这个函数存在了,至于函数内部的变量和逻辑,解释器根本不关心。

等执行到函数调用的时候,Python解释器会再开辟一块内存来储存这个函数里面的内容,这个时候,才关注函数里面有哪些变量,而函数中的变量回储存在新开辟出来的内存中,函数中的变量只能在函数内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。

我们给这个‘存放名字与值的关系’的空间起了一个名字-------命名空间。

代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间;

在函数的运行中开辟的临时的空间叫做局部命名空间。

全局名称空间:是一个存储变量名和变量值对应地址的信息的一个容器

局部名称空间:在函数运行中临时开辟的空间。(临时存在)

内置名称空间:python中内部已经定义好的函数

作用域

全局作用域:包括全局名称空间和内置名称空间

局部作用域:局部名称空间(临时存在的,调用完成后就消失)

取值顺序:就近原则,先从局部名称空间找,再到全局名称空间找,最后在到内置函数空间找

加载顺序:内置名称空间---》全局名称空间(当程序执行时)---》局部名称空间(当函数调用时)

函数的嵌套:一步一步看,不要粗心

即在函数内部嵌套函数

# x=1
# def f1():
#     def f2():
#         print(locals())
#         print(x)
#     print(locals())
#     return f2
# x=100
# def f3(func):
#     x=2
#     print(locals())
#     func()
# x=10000
# f3(f1())
# print(x)        #最后输出结果为10000

关键字:global nonlocal

global

1.声明一个全局变量

  2.在局部作用域想要对全局作用域的全局变量进行修改时,需要用到global

  注意:对于可变的数据类型(list,dict,set)可以直接引用而不需要通过global

l2 = [1,3,4]
dic ={"a":"b","c":"d"}
def func1():
    l2.append(6)
    dic["q"] = 3
    print(dic)    #{'a': 'b', 'c': 'd', 'q': 3}
    print(l2)    #[1, 3, 4, 6]
func1()
print(dic)    #{'a': 'b', 'c': 'd', 'q': 3}
print(l2)    #[1, 3, 4, 6]

nonlocal

1.不能修改全局变量

  2.在局部作用域中,对父级作用域(或者更外层,非全局作用域)的变量进行引用和修改,并且用的哪层,从那成即以下此变量全部发生改变

# def func1():
#     b = 42
#     def func2():
#         nonlocal b
#         b += 10
#         print(b)            #b = 52
#         def func3():
#             nonlocal b
#             b += 20
#             print(b)        #b= 72
#         func3()
#     func2()
# func1()

函数的作用域链

小范围作用域可以使用大范围的变量,但是反之不行,因为他是单项的

补充

在Python3将reduce函数放在functools 中了,

from functools import reduce
list1 = [1, 2, 3, 4]
def my_sum(x, y):
    return x + y
ret = reduce(my_sum, list1)#将列表中的一二个元素放入函数中,计算完,再放一个元素
print(ret)#输出为10

标签:func1,进阶,作用域,空间,print,def,函数
From: https://www.cnblogs.com/mengdie1978/p/17400766.html

相关文章

  • 函数名的作用:函数也是第一类对象
    函数名的作用:函数也是第一类对象​ 1.函数名就是函数的内存地址2.函数名可以作为变量3.函数名可以作为函数的参数4.函数名还可以当做函数的返回值5.函数名可以作为容器类型的元素(列表中的一个元素)globals()locals()​ globals()#作用是返回全局变......
  • memset() 函数的使用
    //Lvxin1-1 memset.cpp //memset()函数的使用 #include<stdio.h>#include<string.h> intmain(){   charstr[]="almosteveryprogrammershouldknowmemset!";   doubled;   memset(&d,0,sizeof(d));   memset(str,'......
  • 【C语言】结构体进阶
     一、结构体1.结构体的声明              (1)结构的基础知识                结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。             (2)结构的声明structtag{member-list;}variable......
  • 进阶篇丨链路追踪(Tracing)很简单:常见问题排查
    作者:涯海经过前面多篇内容的学习,想必大部分同学都已经熟练掌握分布式链路追踪的基础用法,比如回溯链路请求轨迹,定位耗时瓶颈点;配置核心接口黄金三指标告警,第一时间发现流量异常;大促前梳理应用上下游关键依赖,联系相关方协同备战等等。随着深入使用链路追踪技术,问题发现与诊断方面的......
  • (转载)PYTHON修饰器的函数式编程--纪念下陈皓老师
    PYTHON修饰器的函数式编程2014年的时候陈老师就写了这个python装饰器的文章,比现在的很多的文章都好谨以此文纪念下陈皓老师Python的修饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟DesignPattern里的Decorator搞混了,其实这是完全不同的两个东西。虽然好......
  • 实验四 函数与异常处理编程
    实验任务一程序源代码:1print(sum)2sum=423print(sum)45definc(n):6sum=n+17print(sum)8returnsum9sum=inc(7)+inc(7)10print(sum)实验结果:问题:task1.py源码中,共有4处有python语句print(sum)(line1,line3,line7,line11)。这4......
  • 实验4 函数与异常处理编程
    实验任务1task11print(sum)2sum=423print(sum)45definc(n):6sum=n+17print(sum)8returnsum91011sum=inc(7)+inc(7)12print(sum)ViewCode不是同一个对象名称 1.Built-in。2和3Global。4.Local实验任务2task2-......
  • 实验4 函数与异常处理编程
    实验任务1task1.py程序源码:1print(sum)2sum=423print(sum)4definc(n):5sum=n+16print(sum)7returnsum8sum=inc(7)+inc(7)9print(sum)运行测试截图: 1.task1.py源码中,共有4处有python语句print(sum)(line1,line3,line7,line11......
  • 实验4 函数与异常处理编程
    实验任务1task1.py实验源码:1print(sum)2sum=423print(sum)45definc(n):6sum=n+17print(sum)8returnsum910sum=inc(7)+inc(7)11print(sum)实验结果:实验任务2task2_1.py实验源码:1deffunc1(a,b,c,d,e,f):2......
  • 母函数详解(定义,模板代码,用法)
    本篇文章前半部分的母函数定义及讲解,和后面的题目推荐,在数学中,某个序列的母函数(Generatingfunction,又称生成函数)是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息。使用母函数解决问题的方法称为母函数方法。母函数可分为很多种,包括普通母函数、指数母函数、L级数、贝......