1. 函数参数--动态传参

  昨天已经解过了传参, 如果需要给一个函数传参,而参数又是不确定的. 或者我们给一个函数传很多参数, 我的形参就要写很多, 写起来就很麻烦, 这时我们可以考虑使用动态参数.形参的第三种:动态参数.

(1) 动态参数分为两种:

  1) 动态接收位置参数

  语法: def 函数名(*args):         在形参前加个'*'符号

def chi(*food):  # *表示任意,即可以接收任意位置参数
print('我要吃',food) # 动态参数接收到的是tuple类型的数据
chi('大盘鸡','火锅','烤鱼','烤鸭','冰淇淋')# 我要吃 ('大盘鸡', '火锅', '烤鱼', '烤鸭', '冰淇淋') def food(he,tang,*cai):
print('我要吃',he,cai,tang)
food('可乐','紫菜蛋花汤','大盘鸡','烧烤') #实参'可乐','紫菜蛋花汤'传递给了形参'he','tang',实参'大盘鸡','烧烤'传给了形参'cai'
# 我要吃 可乐 ('大盘鸡', '烧烤') 紫菜蛋花汤 # 定义求一组数相加的和的函数
def sun(*a):
sum = 0
for c in a:
sum = sum + c
return sum #返回值为sum
print(sun(1,2,3,4,5,6,7,8,9,10)) #

  2) 动态接收关键字参数

  语法: def    函数名(**kwargs):     在形参前面加两个'*'符号

def food(**a):   # **表示任意,即任意接收关键字参数
print('我想吃',a) # 接收到的是字典
print(food(主食='米饭',菜='大盘鸡',喝的='可乐')) #我想吃 {'主食': '米饭', '菜': '大盘鸡', '喝的': '可乐'}

  形参有位置参数,默认值参数,动态位置参数(*args),动态接收关键字参数(**kwsrgs)这四种. 他们写的先后顺序是:

  位置参数>>动态接收位置参数>>默认值参数>>动态接收关键字参数

def f(*args,a,b):  #动态接收位置参数写在位置参数前会导致传入的所有实参都传递给'*args',而a,b没有值
print(args,a,b)
f(1,2,3,4,5,6) #会报错因为a,b没有值 TypeError: f() missing 2 required keyword-only arguments: 'a' and 'b' def f(a,b,*args): #改变一下位置,把*args写在位置参数后面
print(args, a, b)
f(1,2,3,4,5,6) #(3, 4, 5, 6) 1 2
def f(a,b,c='hello',*args):  #当默认值参数在*args前面,想要传递给*args值,就必须要传递'c'的值.不想给c值,就无法给*args值
print(a,b,c,args)
f(1,2,3,4,5) #1 2 3 (4, 5)
f(1,2) #1 2 hello () def f(a,b,*args,c='hello'): #把默认值参数放后面,在传递完*args的值后,最后可以用关键字参数传给c
print(a,b,c,args)
f(1,2,3,4,c='world') #1 2 world (3, 4)
给定义函数的两个形参*args和**kwargs, 那么这个函数可以接收所有的参数
def fuc(*args,**kwargs):
print(args,kwargs)
fuc('hello','world','hhhh',一 ='one',二 ='two',三 ='three')
#('hello', 'world', 'hhhh') {'一': 'one', '二': 'two', '三': 'three'}
把列表中的每一个元素作为参数, 传递给函数. 一次都传过去
def func(*args, **kwargs):  # *表示聚合,所有的位置参数, 聚合成元组 **聚合成字典
print(args)
print(kwargs)
lst = ["one", "two", "three", "four"]
func(*lst) # 实参, 打散, 迭代产生的
#('one', 'two', 'three', 'four')
# {} dic = {"name":"alex", "sex":"男"}
func(**dic) # 把字典打散. 以key=value形式进行传参
#()
# {'name': 'alex', 'sex': '男'}

(2) 函数的注释 先写'''''',然后在六个单引号中间位置按回车,自动生成注释

def f(a,b):
'''
介绍函数的功能,返回的值
:param a: 介绍变量a
:param b: 介绍变量b
:return: 介绍返回值
''' pass

2. 命名空间和作用域

   在python解释器开始执行之后, 就会在内存中开辟一个空间, 每当遇到一个变量的时候, 就把变量名和值之间的关系记录下来, 但是当遇到函数定义的时候, 解释器只是把函数名读入内存, 表示这个函数存在了,  ⾄至于函数内部的变量和逻辑, 解释器是不关心的. 也就是说一开始的时候函数只是加载进来, 仅此⽽而已, 只有当函数被调用和访问的时候, 解释器才会根据函数内部声明的变量来进行开辟变量的内部空间. 随着函数执行完毕, 这些函数内部变量占用的空间也会随着函数执行完毕而被清空.

def f(a):
a = 10
return a
print(f(3)) #
print(a) #a不存在了,NameError: name 'a' is not defined

  存放名字和值的关系的空间叫命名空间. 变量在存储的时候就是存储在这片空间中的.

  命名空间分类:

  1. 全局命名空间--> 直接在py文件中, 函数外声明的变量都属于全局命名空间

  2. 局部命名空间--> 在函数中声明的变量会放在局部命名空间

  3. 内置命名空间--> 存放python解释器提供的名字, list, tuple, str, int这些都是内置命名空间

  加载顺序:

  1. 内置命名空间

  2. 全局命名空间

  3. 局部命名空间(函数被执⾏行行的时候)

  取值顺序:

  1. 局部命名空间

  2. 全局命名空间

  3. 内置命名空间
   

a = 10  #全局
def f(): #全局
a = 20 #局部
print(a) #从局部空间取a的值
f() #
print(a) #
a = 10
def f():
print(a) #找不到局部a的值时,会去全局命名空间找,如果全局也没有,那么就从内置命名空间找.
f() #
print(a) #

  作用域 :  作用域就是作用范围, 按照生效范围来看分为全局作用域和局部作用域

  全局作用域 : 包含内置命名空间和全局命名空间. 在整个文件的任何位置都可以使用(遵循 从上到下逐行执行).

  局部作用域 : 在函数内部可以使用.

  作用域命名空间 :

  1. 全局作用域 :    全局命名空间 + 内置命名空间

  2. 局部作用域 :    局部命名空间    我们可以通过globals()函数来查看全局作用域中的内容,  也可以通过locals()来查看局部作用域中的变量和函数信息

a = 10
def func():
a = 20
print(a) # 就近原则
print(globals()) # globals() 获取到全局作用域(内置,全局)中的所有名字
print(locals()) # locals() 查看当前作用域中的所有名字
func()
#
# {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at
#0x0000011BD70A6160>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__':
#'D:/pycharm/练习/week02/new10.py', '__cached__': None, 'a': 10, 'func': <function func at 0x0000011BD74697B8>}
# {'a': 20}

3. 函数的嵌套

(1)只要遇见了()就是函数的调用, 如果没有()就不是函数的调用.

(2) 函数的执行顺序

def func1():
print("赵")
def func2():
print("钱")
def func3():
print("孙")
print("李")
def func4():
print("哈哈")
func2()
print("周")
func2()
func1()
# 赵
# 周
# 钱
# 李

 

4. gloabal, nonlocal关键字

(1) global表示不再使用局部作用域中的内容了. 而改用全局作用域中的变量

a = 10  #全局变量
def f():
global a #把全局变量的a拿来用了
a = a + 20 #改变的a是全局变量a
print(a)
f() #
print(a) #
def f():
global a #建立一个全局变量的a
a = 20 #给全局变量a赋值
print(a)
f() #
print(a) #

(2)nonlocal 表示在局部作用域中, 调用其他层的局部变量(就近原则调用).

a = 10
def f():
a = 20
print(a) 320
def ff():
nonlocal a # 找局部作用域中 离他最近的那个变量引入进来,将函数f中的a引入
a = a + 20 #函数f中的a变成40
print(a) #
ff()
print(a) #
f()
#
#
#
print() #

函数的进阶(动态参数,命名空间和作用域,函数的嵌套,gloabal和nonlocal关键字)的更多相关文章

  1. day11函数的进阶动态参数,命名空间,作用域,第一类对象

    一.习题收藏 5.写函数,计算传入字符串中[数字].[字母].[空格] 以及 [其他]的个数,并返回结果. # def func4(s): # dic = { # 'num':0,'alpha':0, ...

  2. python基础学习Day10 函数形参的动态参数、*args **kwargs 命名空间 global 与 nonlocal

    一.函数形参的动态参数 原因:为了拓展,对于实参数量不固定,故需要万能参数,即动态参数, *args   **kwargs # def sum1(*args): # 在函数定义时,在*位置参数,聚合. ...

  3. python 全栈开发,Day10(动态参数,命名空间,作用域,函数嵌套)

    一.动态参数 def func(a,b,c,d,e,f,g): pass func(1,2,3,4,5,6,7) 如果加30个参数呢?有没有万能的参数,可以代表一切参数呢? *args 动态参数,万能 ...

  4. python 函数的动态参数 命名空间,作用域以及函数嵌套,global和nonlocal (重点)

    *** 坚持坚持,即使你不太强*** 1.函数的动态传参 2.函数的命名空间及作用域 3.函数嵌套 4.global和nonlocal关键字 一.函数的动态传参 1. *args: 位置参数动态传参, ...

  5. 【学习笔记】--- 老男孩学Python,day10, 函数, 动态参数 命名空间\作用域 global nonlocal

    1. 动态参数 位置参数的动态参数: *args 关键字参数的动态参数 : **kwargs 顺序:位置---*args---默认值---**kwargs 在形参上*聚合, **聚合 在实参上*打散, ...

  6. 动态参数 名称空间 作用域 作用域链 加载顺序 函数的嵌套 global nonlocal 等的用法总结

    03,动态参数 *args,**kwargs # 用户传入到函数中的实参数量不定时,或者是为了以后拓展,# 此时要用到动态参数*args,**kwargs(万能参数.)# *args接收的是所有的位置 ...

  7. c++ 命名空间 以及 作用域 函数参数 面向对象实验报告

    面向对象的分析与设计  实验报告一 一.变量的储存类别 auto static register extern auto变量   函数中的局部变量,如不专门声明为static存储类别,都是动态地分配存 ...

  8. python函数知识二 动态参数、函数的注释、名称空间、函数的嵌套、global,nonlocal

    6.函数的动态参数 *args,**kwargs:能接受动态的位置参数和动态的关键字参数 *args -- tuple *kwargs -- dict 动态参数优先级:位置参数 > 动态位置参数 ...

  9. function(函数)中的动态参数

    我们可向函数传递动态参数,*args,**kwargs,首先我们来看*args,示例如下:     1.show(*args) def show(*args): print(args,type(arg ...

随机推荐

  1. Java中break和continue跳出指定循环

    https://www.cnblogs.com/miys/p/b7f6a463bc58785d74a8a7fccd1f1243.html 在Java中,break和continue可以跳出指定循环,在 ...

  2. 网站基于vs,复选框,单选款

    前端代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.a ...

  3. LA3641 Leonardo's Notebook

    题意 PDF 分析 给出一个26个大写字母的置换B,是否存在A^2 = B 每个置换可以看做若干个循环的乘积.我们可以把这些循环看成中UVa 10294的项链, 循环中的数就相当于项链中的珠子. A^ ...

  4. jsp&el&jstl mvc和三层架构

    jsp:java在html中插入java 一.JSP技术 1.jsp脚本和注释 jsp脚本:(翻译成servlet,源码位置apache-tomcat-7.0.52\work\Catalina\loc ...

  5. zabbix监控mysql最简单的方法

    该实验基于我的上一篇文章监控第一台主机的基础上 首先,因为水平有限,我选择直接关闭了防火墙和SELinux. 环境: 两台centos7,服务器端IP是192.168.200.128(以下简称主机), ...

  6. Java中的包学习笔记

    一.总结 1.引入包的概念的原因和包的作用比如有多个人开发一个大型程序,A定义了一个Math.java类,B也定义了一个Math.java类,它们放在不同目录,使用的时候也是用目录来区分,包实际上就是 ...

  7. How to make a user a local admin on just one computer

    log in to each "test" PC as the local admin Go to "Control Panel", "User Ac ...

  8. mybatis 一对多,(多对一,一对一

    多对一,和一对一是同一种写法,每种写法又分在数据库关联和在mybatis关联 1,多对一,一对一数据库关联 2,多对一,一对一mybatis关联 3,一对多,数据库关联,注意,Java type改of ...

  9. Flume 拦截器(interceptor)详解

    flume 拦截器(interceptor)1.flume拦截器介绍拦截器是简单的插件式组件,设置在source和channel之间.source接收到的事件event,在写入channel之前,拦截 ...

  10. 【转】类似py2exe软件真的能保护python源码吗

    类似py2exe软件真的能保护python源码吗 背景 最近写了个工具用于对项目中C/C++文件的字符串常量进行自动化加密处理,用python写的,工具效果不错,所以打算在公司内部推广.为了防止代码泄 ...