返回顶部
首页 > 资讯 > 后端开发 > Python >python3--函数进阶
  • 379
分享到

python3--函数进阶

进阶函数 2023-01-30 21:01:47 379人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

例子def func(a,b,c,d,e,f,g):    passprint(func(a, b , c, d, e, f, g))如果再加30个参数呢?,在后面继续添加?有没有万能的参数,可以代表一切参数呢?*arg

例子

def func(a,b,c,d,e,f,g):

    pass

print(func(a, b , c, d, e, f, g))

如果再加30个参数呢?,在后面继续添加?有没有万能的参数,可以代表一切参数呢?


*args 动态参数,万能参数

args接收的就是实参对应的所有位置参数,并将其放在元组中,它不会接收关键字参数

例子

def func(*args):
    pass
func(1,2,3,4,5,6,7,8,9)

执行没有报错

def func1(*args):
    print(args)
func1(1,2,3,4,5,6,7,8,9)

执行结果是一个元组

(1, 2, 3, 4, 5, 6, 7, 8, 9)


形参对应顺序

错误的示例

def func(*args,a,b,c,d,e='sex'):
    print(args)
    print(a)
    print(b)
    print(c)
    print(d)
func(1,2,3,4,5)

执行报错

TypeError: func() missing 4 required keyWord-only arguments: 'a', 'b', 'c', and 'd'

因为*args接收了所有实参,所以缺少了a,b,c,d


形参对应顺序

#位置参数,*args,默认参数

正确的示例

def func(a,b,c,d,*args,e='男'):
    print(a)
    print(b)
    print(c)
    print(d)
    print(args)
    print(e)
func(1,2,3,4,10,9,8,7,e='女')

执行结果

blob.png


*args参数,可以不传,默认为空()

示例

def func(a,b,c,d,*args,e='男'):
    print(a)
    print(b)
    print(c)
    print(d)
    print(args)
    print(e)
func(1,2,3,4,e='女')

执行结果

blob.png

*args名字可以随便更改,args只是一个变量而已,但是约定默认使用的就是*args,建议不要更改


**kwargs

示例代码

def func(a,b,c,**kwargs):
    print(kwargs)
func(1,2,3,r=4,s=5)

执行结果

blob.png

**kwargs只接收关键字参数

**kwargs动态传参,他将所有的关键字参数放到一个字典中,返回的结果是一个字典,从前往后找


示例

def func(a,b,c,**kwargs):
    print(kwargs)
func(1,2,3,r=4,b1=5,c1=6,d=7)

执行结果为

{'d': 7, 'c1': 6, 'r': 4, 'b1': 5}


**kwargs动态传参,他将所有的关键字参数(非位置对应的)放到一个字典中


示例

def func(a,b,c,**kwargs):
    print(kwargs)
func(1,2,r=4,b1=5,c1=6,c=7)

执行结果

{'c1': 6, 'b1': 5, 'r': 4}

**kwargs动态传参,他将所有的关键字参数(无意义的)放到一个字典中

上面示例中的c参数,是有意义的

blob.png


最终顺序:位置参数,*args,默认参数,**kwargs

例子:

def func(a,b,c,d,*args,e='男',**kwargs):
    print(a)
    print(b)
    print(c)
    print(d)
    print(args)
    print(e)
    print(kwargs)
func(1,2,3,4,5,6,7,v=3,m=7,h=9,e='女')

执行结果

blob.png


一般情况下,用这种方式就可以了

def func(*args,**kwargs):
    pass
func()

查看python源码

blob.png


*魔法运用

例子

def func(*args):
    print(args)
l1 = [1,2,30]
l2 = [1,2,33,21,45,66]
func(*l1)
func(*l1,*l2)

执行结果

blob.png

在函数的调用时,*代表打散


例子2

def func(*args):
    print(args)
l1 = [1,2,30]
l2 = [1,2,33,21,45,66]
tu = (1,2,3)
func(*l1,*l2,*tu)

执行结果

(1, 2, 30, 1, 2, 33, 21, 45, 66, 1, 2, 3)

*就相当于迭代添加

在函数的调用时,*可迭代对象,代表打散(list,tuple,str,dict(键))


比如用到要传多个列表时,需要用到魔法运用

def func(*args):
    print(args)
func(1,2,3,10,20,80)

执行结果

(1, 2, 3, 10, 20, 80)

在函数的调用执行时,*可迭代对象,代表打散

在函数定义时,*args代表的是聚合


将字典的键值对,添加到函数中

def func(**kwargs):
    print(kwargs)
dic1 = {'name1':'sam','age1':16}
dic2 = {'name2':'tom','age2':20}
func(**dic1,**dic2)

执行结果

{'age1': 16, 'age2': 20, 'name1': 'sam', 'name2': 'tom'}

**kwargs只限于字典


在函数的调用执行时,

*可迭代对象,代表打散(list,tuple,str,dict(键))将元素一一添加到args

**字典,代表打散,将所有键值对放到一个kwargs字典里


在函数定义时,*args,**kwargs代表的是聚合

def func(*args,**kwargs):
    print(args)
    print(kwargs)
dic1 = {'name1':'sam','age1':18}
dic2 = {'name2':'tom','age2':20}
func(*[1,2,3,4],*'abcdef',**dic1,**dic2)

执行结果

(1, 2, 3, 4, 'a', 'b', 'c', 'd', 'e', 'f') #打散

{'name1': 'sam', 'age1': 18, 'name2': 'tom', 'age2': 20} #聚合


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

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

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

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

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


命名空间和作用域

命名空间一共分为三种

全局命名空间

局部命名空间

内置命名空间


内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法

三种命名空间之间的加载和取值顺序

加载顺序:内置命名空间(程序运行前加载)-->全局命名空间(程序运行中:从上到下加载)-->局部命名空间(程序运行中:调用时才加载)

例子

def my_len(argv):
    return 666
print(len([12,3]))

执行结果,因为函数没有被调用,所以直接打印len里面列表的长度

2   


取值顺序:

    在局部调用:局部命名空间-->全局命名空间-->内置命名空间

    在全局调用:全局命名空间-->内置命名空间

综上所述,在找寻变量时,从小范围,一层一层到大范围去寻找

例子

name = '张三'
def func():
    name = 'sam'
    print(name)
func()

执行结果,程序运行中,从上到下加载,name的值被局部命名空间里的值覆盖了

sam


例子2

a = 2
print(a)
def func():
    age = 11
    print(age)
func()

执行结果

2

11


例子3

print(111)
def func1():
    print(333)
def func2():
    print(444)
def func3():
    print(555)
    func2()
func1()
print(222)

执行结果,从上往下执行,首先打印111,中间遇到了几个函数,只是暂存到内存中,并不执行,后面调用func1,从而打印333,下面的几个函数没有调用,所以不执行,最后打印222

111

333

222


例子4

print(111)
def func1():
    print(333)
    func2()
    print(666)
def func2():
    print(444)
def func3():
    print(555)
func1()
print(222)

执行结果,先手打印111,遇到func1-3函数暂存到内存中,遇到调用func1函数,打印出333,然后调用func2,打印444,这里注意,要等func2执行完成后,才会执行func1后面剩余的print(666),最后打印222

111

333

444

666

222


例子5

def f1():
    def f2():
        def f3():
            print("in f3")
        print("in f2")
        f3()
    print("in f1")
    f2()

f1()

执行结果,调用f1,先打印'in f1'在调用f2,打印'in f2'在调用f3,打印'in f3'

in f1

in f2

in f3


作用域

作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域

全局作用域:包含内置名称空间,全局名称空间,在整个文件的任意位置都能被引用,全局有效

局部作用域:局部名称空间,只能在局部范围内生效

globals和locals方法

globals:全局名称空间:所有变量

locals:局部名称空间:所有变量

例子

a = 2
b = 3
def func1():
    c = 5
    d = 6
    print(globals()) #全局变量放在一个字典中
    print(locals()) #局部变量(函数里的c,d)放在一个字典中
func1()

执行结果

blob.png


例子2

a = 3
b = 5
def func1():
    c = 6
    d = 8
    e = 10
    print(globals()) #全局变量放在一个字典中
    return locals()  #局部变量(函数里的c,d,e)放在一个字典中
print(func1())

如果逻辑比较多,可以使用return locals() 查看函数所有局部变量,返回字典类型


global关键字,nonlocal关键字

global:

1 声明一个全局变量

2 在局部作用域想要对全局作用域的全局变量进行修改时,需要用到global(限字符串,数字)

例子1

def func1():
    global name
    name = '你好'
    print(name)
func1()
print(name)

执行结果,在局部空间内,声明一个全局变量

你好

你好


例子2

name = '哈哈'
def func1():
    global name
    name = '你好'
func1()
print(name)

执行结果,因为函数func1里面声明使用全局变量name,对name的值进行了修改,所以最后打印的值是函数里面name的值

你好


例子3

def func1():
    global a
    a = 5
func1()
a = 4
print(a)

执行结果,代码从上至下执行,最后a=4把a的值覆盖了

4


对可变数据类型(list,dict,set)可以直接引用不用通过global

例子

li = [1,2,3]
dic = {'a':'b'}
def change():
    li.append('a')
    dic['q'] = 'g'
    print(dic)
    print(li)
change()
print(li)
print(dic)

执行结果,很明显,这里没有使用global声明,也可以直接添加

{'q': 'g', 'a': 'b'}

[1, 2, 3, 'a']

[1, 2, 3, 'a']

{'q': 'g', 'a': 'b'}


nonlocal

1 不能修改全局变量

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


错误例子

a = 4
def func1():
    nonlocal a
    a = 5
func1()
print(a)

执行报错

SyntaxError: no binding for nonlocal 'a' found


例子

def func1():
    b = 6
    def func2():
        nonlocal b #
        b = 666
        print(b)
    func2()
func1()

执行输出

666


例子2

def add_b():
    b = 42
    def do_global():
        b = 10
        print(b)
        def dd_nonlocal():
            nonlocal b
            b = b + 20
            print(b)
        dd_nonlocal()
        print(b)
    do_global()
    print(b)
add_b()

执行结果

10

30

30

42


--结束END--

本文标题: python3--函数进阶

本文链接: https://lsjlt.com/news/179040.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python3--函数进阶
    例子def func(a,b,c,d,e,f,g):    passprint(func(a, b , c, d, e, f, g))如果再加30个参数呢?,在后面继续添加?有没有万能的参数,可以代表一切参数呢?*arg...
    99+
    2023-01-30
    进阶 函数
  • python3--高阶函数
    # Auther: Aaron Fan'''# 高阶函数:把一个函数名,以实参的形式,传给这个函数的形参,这个函数就称为高阶函数。比如下面的形参c,对应的实参是一个函数名abs。# 函数abs()的功能是取绝对值def add(a,b,c)...
    99+
    2023-01-31
    高阶 函数
  • Python3的高阶函数map,red
    函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。注意其中:map和filter返回一个惰性序列,可迭代对象,需要转化为list >>> a = 3.1415 >>&g...
    99+
    2023-01-31
    高阶 函数 map
  • Python3的高阶函数怎么用
    本篇内容介绍了“Python3的高阶函数怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.高阶函数# 1.变量指向函数#&n...
    99+
    2023-06-28
  • Python之函数进阶
    一.形参的动态参数: 动态参数,用于参数不确定时用. 格式: def fun (*args) fun(args) 1. 动态接收位置参数:动态参数必须在位置参数后.列子1.假如参数不确定时,如下的列子,每人饭量不一样,吃的种类不一样,此时...
    99+
    2023-01-30
    进阶 函数 Python
  • python函数的进阶
    1. 动态传参 *, ** : 形参: 聚合 位置参数* -> 元组 关键字** -> 字典 实参: 打散...
    99+
    2023-01-30
    进阶 函数 python
  • python3入门与进阶(二)
    变量 python3中变量的定义是不固定类型的(动态),区分大小写 值类型 引用类型 不可变的(值类型) 可变的(引用类型) int (整型) list (列表) str (字符串) set (集合) tuple (...
    99+
    2023-01-31
    进阶 入门
  • python函数进阶之闭包函数
    目录闭包函数什么是闭包函数判断是否是闭包函数\__closure__cell_contents闭包函数的特点闭包函数的意义闭包函数 什么是闭包函数 如果内函数使用了外函数的局部变量,...
    99+
    2024-04-02
  • day 10 函数的进阶
    动态传参 (重点)  *    ** 形参  * args在形参位置, *表示不定参数--接受的是位置参数   接受到的位置参数的动态传参:  都是元组 形参的顺序: 位置  *args 默认值  **kwargs   以后写参数,可以随...
    99+
    2023-01-30
    进阶 函数 day
  • python3 将阶乘改成函数形式进行调用的操作
    定义一个函数,求一个数的阶乘,比如求5! #方法1,递归 def jc(num): if num==1: return 1 else: return nu...
    99+
    2024-04-02
  • python3--面向对象的进阶
    昨日内容练习class A:     def func1(self):pass  # func1 普通方法   &nbs...
    99+
    2023-01-30
    进阶 面向对象
  • javascript之函数进阶详解
    目录函数定义方式函数的调用(6种)this指向问题严格模式高阶函数闭包递归:函数里面调用自己,需要有结束条件函数定义方式 function fn(){}//命名函数 var ...
    99+
    2024-04-02
  • python3-开发进阶Flask的基础
     一、概述 最大的特点:短小精悍、可拓展强的一个Web框架。注意点:上下文管理机制,依赖wsgi:werkzurg 模块 二、前奏学习werkzurg 先来回顾一个知识点:一个类加括号会执行__init__方法,一个对象加括号执行__ca...
    99+
    2023-01-30
    进阶 基础 Flask
  • Python3实用编程技巧进阶
    var 立即前往 = " http://icourse8.com/Python3_pcjqjj.html "; 章节信息 第1章 课程简介(本课程基于py3.x并赠送py2.x的讲解) 第2章 数据结构与算法相关问题与解决技巧 ...
    99+
    2023-01-31
    进阶 编程技巧
  • Python进阶-函数默认参数(详解)
    一、默认参数 python为了简化函数的调用,提供了默认参数机制: def pow(x, n = 2): r = 1 while n > 0: r *= x n -= 1...
    99+
    2022-06-04
    进阶 详解 函数
  • 一篇文章带你学习Python3的高阶函数
    目录1.高阶函数2.map/reduce3.filter4.sorted总结1.高阶函数 # 1.变量指向函数 # 调用函数和函数本身 print("-10的绝对值为:",abs(-...
    99+
    2024-04-02
  • Oracle进阶DECODE函数使用详解
    DECODE含义 decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值) 这个是decode的表达式,具体的含义解释为: IF 条件=值1 THEN   ...
    99+
    2024-04-02
  • Golang函数的进阶使用指南
    go 函数的进阶用法包括:闭包:可访问外部变量的内部函数,用于附加状态或延迟执行。变参函数:接收可变数量相同类型参数的函数,表示为 ...t 切片。递归函数:调用自身的函数,用于解决可分...
    99+
    2024-04-15
    函数 golang
  • JavaScript中函数进阶是怎样现进行的
    JavaScript中函数进阶是怎样现进行的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。全局作用域· 全局作用域是最大的作用域·&...
    99+
    2024-04-02
  • python3 函数
    形式参数: 实际参数:固定数参数 默认参数:给参数一个默认值,赋予新值时覆盖默认值。 位置参数:sys.argv[XX] 代码名称、函数、变量不可以与系统默认参数、模块名字相同 if __name__ == '__main__': __...
    99+
    2023-01-31
    函数
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作