函数初识二

1. 函数的动态参数

  • *args **kwargs
def func(a,b,*args):
    print(a,b,args)
func(1,2,3,4,5,6)
结果:
1 2 (3,4,5,6)  可以传递多个参数,以元组形式出现

def func(a,b,*args):
    print(a,b,*args)  # *args将元组打散
func(1,2,3,4,5,6)
结果:
1 2 3 4 5 6
def num(*args,a=1,b=2):
    print(a,b,args)
num(1,2,3,4,5,6)
结果:
 1 2 (1,2,3,4,5,6) #打印顺序原因

下边的也可以,不报错,但没有意义

def func(a=1,b=2,*args):
    print(a,b,args)
func(10,11,12,13,14,15)
结果:
10 11 (12,13,14,15)

参数排列顺序:优先级

位置参数 > 动态位置参数 > 默认参数 (关键字参数) > 动态关键字参数

def func(a,b,**kwargs):
    print(a,b,kwargs)   #kwargs 以字典形式输出
func(1,2,c=3,d=4)
结果:
1 2 {"c":3,"d":4}  
def func(a,b,**kwargs):
    print(a,b,*kwargs)   # *kwargs 获得的是字典的键
print(1,2,c=3,d=4)
结果:
1 2 c d 
def func(a,b,*args,c=3,d=4,**kwargs):
    print(a,b,args,c,d,kwargs)
func(1,2,3,4,c=5,d=6,bj= "首都",alex="IT")
结果:
1 2 (3, 4) 5 6 {'bj': '首都', 'alex': 'IT'}

万能传参

def func(*args,**kwargs):
    print(args,kwargs)
func(1,2,3,a=3,b=4,c=5)
结果:
(1, 2, 3) {'a': 3, 'b': 4, 'c': 5}

2. 注释

? 不开头,6个双引号,上三下三

def func(user,password):
    """
    密码加密
    :param a:   用户名                    注释内容
    :param b:  密码
    :return:  加密的密码
    """
func()

查看注释

print(func.__doc__) _ _

3. 名称空间

  • 内置空间:放置内置函数的空间,如print(),inpurt().len()
  • 全局空间:当前.py文件组要开辟的空间,放在全局空间
  • 局部空间:.py文件中顶头书写,函数中开辟的空间就是局部空间

加载顺序: 内置空间 >全局空间 >局部空间

取值顺序:局部空间 >全局空间>内存空间

作用于:

全局作用域:内置空间+全局空间

局部作用域:局部空间

def func():
    print("1")
    def f1():
        print(2)
    return f1()
func()

不管在什么位置,只要是函数名+(),就是在调用此函数,函数调用执行后,函数体中开辟的空间就自动销毁

4. 函数嵌套

def func():
    a = 1
    def foo():
        b = 2
        print(b)
        print(a)
        def f1():
            print(b)
        return f1()
    return foo()
print(func())
#结果:
2 1 2 None

def a():
    a = 1
    c()
    print(c)
def b():
    b = 2
    print(b)
def c():
    c = 3
    print(a)    #   而且不能去同级别函数中寻找,只能去上一级或者更上级寻找
def run():
    a()
run()
结果:
<function a at 0x000000DF3DBFA950>  变量名不加括号是内存地址
<function c at 0x000000DF3DBFAA60>

5. global + 变量 声明修改全局变量的值

a = 10
def func():
    global a    #修改全局变量 a
    a += 1      #修改全局变量 a=11
    print(a)   #第二个打印  11
print(a)       #第一个打印  10
func()
print(a)   #函数结束,但全局变量的a 改变了
结果:
10 11 11

在函数中,局部空间里的变量可以使用全局变量的值,但是不能修改,如果要修改全局变量的值,则需要添加 global + 变量名

6. nonlobal + 变量 不能修改全局变量,只能修改局部变量里的值,逐级修改

  • global : 修改全局空间的变量对应的值
    nonlocal :在外层的函数中,修改局部空间的变量值.完全不涉及全局变量,只修改离它最近的一层,最近的一层没有变量继      续向上找,直到找到最外层函数
a = 10
def func():
    def a():
        a = 20  #下级的修改了,此处不变
        def f1():
            a = 30   #a 被修改了
            def foo():
                nonlocal a   #要修改局部变量的a的值
                a += 1       # 将a 改为 31
                print(a)   # 31
            foo()
            print(a) # 31     #a 已经改变了
        f1()
        print(a)
    a()
func()
print(a)    #全局空间的a 没有发生任何改变
# 结果: 31 31 20 10

原文地址:https://www.cnblogs.com/lvweihe/p/11275964.html

时间: 2024-11-05 22:39:28

函数初识二的相关文章

Python函数初识二

一.变量的作用域LEGB 1.1.变量的作用域 在Python中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的.变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称. 在Python程序中创建.改变.查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域.python的作用域是静态的,在源代码中变量名被赋值的位置决定了该变量能被访问的范围.即Python变量的作用域由变量所在源代码中的位置决定. 1.2.变量作用域的产生 在Py

Python函数初识

一.函数初识 现在有这么个情况:python中的len方法不让用了,你怎么办? 来测试一下'hello word' 的长度: for循环来实现: s1 = "hello world" length = 0 for i in s1: length = length+1 print(length) 但是,需要求另一个字符串的长度,就需要再写一遍: 这样确实可以实现len方法的效果,但是总感觉不是那么完美?为什么呢? 首先,之前只要我们执行len方法就可以直接拿到一个字符串的长度了,现在为了

python之集合、深浅copy、文件操作、函数初识

本节内容:集合.深浅copy.文件操作.函数初识 1.小知识点补充 2.编码二 3.集合 4.深浅copy 5.文件操作 6.函数的初识 1.小知识点补充                                                                                           1.1 小数据池====str.int 小数据池存在的意义就是节省内存 节省内存,位多个变量开辟一个共享空间(str和int) int:-5--256 int===

Python 基础之函数初识与函数参数

一:函数初识 定义:满足某一个方法 满足某一个功能#(1)功能(包裹一部分代码 实现某一个功能 达成某一个目的)#(2)可以反复调用,提高代码的复用性,提高开发效率,便于维护管理#(3)函数的基本格式:#定义一个函数def 函数名():    code1    code2 #调用函数函数名() #例子:(最简单的一个函数)#函数的定义处 def func():    print("我是一个大帅哥") #函数的调用处func() #(4) 函数的命名规则字母数字下划线  首字符不能为数字

04_内置函数(二)

内置函数(二) 1.1 callable() 功能:函数是否可调用 示例1: def f1(): pass f1() f2 = 123 f2() # 输出结果 TypeError: 'int' object is not callable 示例2: def f1(): pass # f1() f2 = 123 # f2() print(callable(f1)) print(callable(f2)) # 输出结果 True False 1.2 chr() 功能:数字转字母,返回对应的ASCII

总结文件操作函数(二)-C语言

格式化读写: #include <stdio.h> int printf(const char *format, ...);                   //相当于fprintf(stdout,format,-); int scanf(const char *format, -); int fprintf(FILE *stream, const char *format, ...);      //中间的参数为写入文件的格式 int fscanf(FILE *stream, const

黑马程序员——c语言学习心得——函数传递二维数组

黑马程序员——c语言学习心得——函数传递二维数组 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.定义指针的时候一定要初始化.   变量定义的时候给变量初始化,这是保证不出错的一个很好的习惯.尤其是在指针的使用上,如果我们没有给指针初始化,就会出现野指针,该指针的指向并不是我们所希望的,一旦错误的释放了这个指针,就会发生内存的访问.那么如何初始化指针变量呢,一般有以下几种方法:   1.初始化空指针   int* pInteger=N

数组合并函数,二维数组相同字段合并到一起。

一般从数据库中提取数据时,会遇到各种各样类型的数据,要求也不尽相同.自己这两天开发的时候遇到一个很纠结的问题,如下: 比如一个二维数组是这样的: Array ( [0] => Array ( [uid] => 231 [username] => 123456 [active] =>aaaa [transfer] =>1111 ) [1] => Array ( [uid] => 231 [username] =>123456 [active] => bb

PHP_I love U之(1)php衣食父母:使用usort()函数为二维数组排序

<?php //PHP_I love U之(1)php衣食父母:使用usort()函数为二维数组排序 //PHP语言中使用usort()函数 为 二维数组排序: // [][]==  a[][1]= 长度; a[][2] = views点击数 $AAlong=10; //变量$AAlong 定义数组长度 //for ($i=0;$i<$AAlong;++$i)  //多维数组扩展时使用- //{ for($j=0;$j<$AAlong;++$j) //for j22  //这段给数组(用