一、函数参数-动态传参
 
    1、形参:
 
      *   在形参位置, 表示此参数为不定参数,接受的是位置参数
           并且接收到的位置参数的动态传参都是元组

  1. def func(* jiemu): # 在形参这里把接受过来的实参进行聚合,集合成一个元组
  2. print(jiemu)
  3.  
  4. func('奇葩说','知识就是力量','老梁说故事','吐槽大会')
  5.  
  6. # 结果:('奇葩说', '知识就是力量', '老梁说故事', '吐槽大会')
 **   在形参表示动态传参 -- 关键字参数
            关键字动态参数,接收到的是字典
  1. def func(**tianqi): # 聚合, ** 聚合成字典
  2. print(tianqi)
  3.  
  4. # func(1,2,3,4,5) # 位置参数或报错, func() takes 0 positional arguments but 5 were given
  5. func(today='晴天', tomorrow='大晴天', yesterday='阴天')
  6. # 结果:{'today': '晴天', 'tomorrow': '大晴天', 'yesterday': '阴天'}
顺序
 
位置   *args   默认值   **kwargs      ,可以随意搭配,必须按照顺序来
  1. # 无敌参数
  2. def func(*args,**kwargs): # argument 参数 key argument 关键字参数
  3. print(args,kwargs)
  4.  
  5. func('a','b',1,2,3,f='小熊',g = '小虎')
  6.  
  7. # 结果:('a', 'b', 1, 2, 3) {'f': '小熊', 'g': '小虎'}
2、实参 
 
   *   在实参是打散,把列表,元组,字符串打散成位置参数进行传递

  1. def eat(*food):
  2. print(food)
  3.  
  4. eat(*"你今天吃了什么")
  5.  
  6. # 结果:('你', '今', '天', '吃', '了', '什', '么')

**  在形参表示动态传参 -- 关键字参数; 打散,打散成关键字

  1. def tianqi(**day): # 聚合,聚合字典
  2. print(day)
  3.  
  4. dic = {'today':'晴天','tomorrow':'要下雪',} # 打散,打散关键字
  5. tianqi(**dic,abs= '还是要下雪')
  6.  
  7. # 结果:{'today': '晴天', 'tomorrow': '要下雪', 'abs': '还是要下雪'}
二、作用域和名称空间
 
     1、名称空间:用来存放名字(变量,函数名,类名,引入的模块名)
 
        1、全局名称空间:我们在py文件中自己写的变量,函数,类,
        2、内置名称空间:我们python解释器提供好的一些内置内容(print,imput,list,tuple,str,int...)
        3、局部名称空间:在函数中声明的变量会放在局部命名空间
            
        名称空间可能会有无数个,和局部名称空间是相对独立的,一般互不干扰
 
         加载顺序:1、内置命名空间  2、全局命名空间 3、局部命名空间(函数被调用的时候)
         取值顺序:1、局部命名  2、全局命名空间  3、内置命名空间
 
        从全局中去找局部  -》找不到
        从局部去找全局 -》 可以找到
        
        2、作用域
 
            作用域就是作用范围,按照生效范围来看分为全局作用域和局部作用域
 
            1、全局作用域:包含内置命名空间和全局命名空间,在整个文件的任何位置都可以使用
            2、局部作用域:局部命名空间,在函数内部使用
 
              通过 globals()函数来查看全局作用域中的内容,也可以通过locals()来查看局部作用域中的变量和函数信息

  1. a = 10
  2. def func():
  3. a = 20
  4. c = 30
  5. def abc():
  6. print('who are you?')
  7. print(a,c) # 这里使用的是局部作用域
  8. print(globals()) # 打印全局作用域中的内容
  9. print(locals()) # 打印局部作用域中的内容
  10.  
  11. func()

三、函数的嵌套

  1. def func1():
  2. print(1)
  3. def func2():
  4. print(2)
  5. def func3():
  6. print(3)
  7. func3()
  8. print(4)
  9. func2()
  10. print(5)
  11.  
  12. func1()

四、关键字global和nonlocal

  1. a = 10
  2. def func2():
  3. a = 20
  4. print('内部的:',a)
  5.  
  6. func2()
  7. print('外部的:',a)
  8.  
  9. # 内部的: 20
  10. # 外部的: 10

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

  1. # 全局变量一般是不能随意改变得
  2. a = 10
  3. def func2():
  4. # 慎用
  5. global a # 表示从全局把一个变量引到局部,后面使用的a都是全局变量
  6. a += 20 # 现在a 是全局变量,在试图改全局变量
  7. print('内部的:',a)
  8.  
  9. func2()
  10. print('外部的:',a)
  11.  
  12. # 内部的: 30
  13. # 外部的: 30

  在局部引入一个全局变量,如果这个变量在全局不存在,global会自动创建一个全局变量

  1. def func():
  2. global a # 创建一个全局变量
  3. a = 10
  4. print(a)
  5. func()
  6. print(a)

nonlocal 表示在局部作用域中,调用父级命名空间(离它最近的一个)中的变量

python -- 函数进阶的更多相关文章

  1. python函数进阶(函数参数、返回值、递归函数)

    函数进阶 目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的作用 函数根据 有没有参数 以及 有没有返回值,可以 相互组合,一共有 4 种 组合形 ...

  2. 第六篇:Python函数进阶篇

    在了解完了 Python函数基础篇之后,本篇的存在其实是为了整合知识,由于该篇的知识是否杂乱,故大家可以通过点开点连接直接进入其详细介绍,该篇主要大致的介绍一下几个知识点:  一.Python的迭代器 ...

  3. python 函数进阶与闭包

    函数的命名空间和作用域 引言 现在有个问题,函数里面的变量,在函数外面能直接引用么? def func1(): m = 1 print(m) print(m) #这行报的错 报错了: NameErro ...

  4. 万恶之源 - Python函数进阶

    函数参数-动态参数 之前我们说过传参,如果我们在传参数的时候不很清楚有哪些的时候,或者说给一个函数传了很多参数,我们就要写很多,很麻烦怎么办呢,我们可以考虑使用动态参数 形参的第三种:动态参数 动态参 ...

  5. python函数进阶

    知识内容: 1.函数即变量 2.嵌套函数 3.lambda表达式与匿名函数 4.递归函数 5.函数式编程简介 6.高阶函数与闭包 一.函数即变量 1.变量的本质 声明一个变量,在python里本质上讲 ...

  6. Python 函数进阶(filter/map/json/zip)

    一.函数即变量 def say(name): print(name)ybq = say #可以被赋值给其他变量ybq('Amily') #调用函数 函数名:say 函数体:第1-2行 返回值:retu ...

  7. 13 Python 函数进阶

    代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间,在函数的运行中开辟的临时的空间叫做局部命名空间 命名空间和作用域 命名空间的本质:存放名字与值的绑定关系 >>> ...

  8. Python—函数进阶篇

    lambda表达式(匿名函数表达式) 作用:创建一个匿名函数对象.同def类似,但不提供函数名. 语法:lambda [形参1,形参2,...] : 表达式 语法说明 lambda 只是一个表达式,它 ...

  9. Python函数进阶:闭包、装饰器、生成器、协程

    返回目录 本篇索引 (1)闭包 (2)装饰器 (3)生成器 (4)协程 (1)闭包 闭包(closure)是很多现代编程语言都有的特点,像C++.Java.JavaScript等都实现或部分实现了闭包 ...

随机推荐

  1. Spring:容器基本用法

    bean是Spring 最核心的东西,打个比方,假设Spring是一个水桶,那么bean就是水桶里的水,水桶离开水后,就没啥作用了.我们先来看一下bean的定义: public class Perso ...

  2. Java SE中的Synchronized

    1 引言 在多线程并发的编程中Synchronized一直是元老级的角色,很多人会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化以后,有些情况下它并不那么重了. ...

  3. nodejs笔记之连接mysql数据库

    1.安装mysql模块: npm install mysql 2.引入mysql模块 创建一个server.js文件 const http = require("http"); c ...

  4. vue 3.0的搭建

    1. 删除以前的vue 2.x版本,并下载3.x版本 npm uninstall -g vue-cli / yarn global remove vue-cli npm install -g @vue ...

  5. asp.net(c#)网页跳转 方法小结

    返回 打印 asp.net(c#)网页跳转七种方法小结_实用技巧_脚本之家 在asp.net下,经常需要页面的跳转,下面是具体的几种方法.跳转页面是大部编辑语言中都会有的,正面我们来分别介绍一下关于. ...

  6. Js重拾

    如果重新声明 JavaScript 变量,该变量的值不会丢失: 在以下两条语句执行后,变量 carname 的值依然是 "Volvo": var carname="Vol ...

  7. mysql和oracle分页查询

    MYSQL分页查询 方式1: select * from table order by id limit m, n; 该语句的意思为,查询m+n条记录,去掉前m条,返回后n条记录.无疑该查询能够实现分 ...

  8. 996.ICU与死亡因素

    昨天,我为996.ICU这场国际运动贡献了一颗星. 关于这件事,第一想到的就是我们工作的初心是为了更好的生活,工作扼杀生活的不良风气应该坚决抵制. 查了一下,近些年人类正常死亡原因中排名前三的原因为: ...

  9. Redis查漏补缺:最易错过的技术要点大扫盲

    考虑到绝大部分写业务的程序员在实际开发中使用Redis时,只会Setvalue和Getvalue两个操作,对Redis整体缺乏一个认知.又恰逢笔者有同事下周要去培训Redis,所以笔者斗胆以Redis ...

  10. 【MySQL】InnoDB 内存管理机制 --- Buffer Pool

    InnoDB Buffer Pool 是一块连续的内存,用来存储访问过的数据页面 innodb_buffer_pool_size 参数用来定义 innodb 的 buffer pool 的大小 是 M ...