本节主要内容:

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

2.名称空间,局部名称空间,全局名称空间,作用域,加载顺序.

3.函数的嵌套

4.gloabal,nonlocal关键字

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

形参的第三种:动态参数

动态参数分成两种:

1.动态接收位置参数

def chi(*food):
print("我要吃", food) chi("⼤米饭", "小米饭") 结果:
我要吃 ('⼤米饭', '小米饭') # 多个参数传递进去. 收到的内容是元组tuple

动态参数接收参数的时候要注意:动态参数必须在位置参数后面

def chi(*food, a, b):
print("我要吃", food, a, b) chi("⼤米饭", "小米饭", "⻩瓜", "茄子")

这时程序运行会报错.因为前面传递进去的所有位置参数都被*food接收了.a和b永远接收不到参数

所以必须改成以下代码:

def chi(*food, a, b):
  print("我要吃", food, a, b)
chi("⼤米饭", "小米饭", a="黄瓜", b="茄子") # 必须用关键字参数来指定

这个时候a和b就有值了,但是这样写呢位置参数就不能用了,所以我们要先写位置参数,然后再用动态参数

def chi(a, b, *food):
print("我要吃", a, b, food)
chi("⼤米饭", "小米饭", "馒头", "面条") # 前两个参数用位置参数来接收, 后面的参数用 动态参数接收

那么默认值参数呢?

def chi(a, b, c='馒头', *food):
print(a, b, c, food) chi("⾹蕉", "菠萝") # 香蕉 菠萝 馒头 (). 默认值生效
chi("⾹蕉", "菠萝", "葫芦娃") # 香蕉 菠萝 葫芦娃 () 默认值不生效
chi("香蕉", "菠萝", "葫芦娃", "口罩") # 香蕉 菠萝 葫芦娃 ('口罩',) 默认值不生效

我们发现默认值参数写在动态参数前面.默认值只有一种情况可能会生效.

def chi(a, b, *food, c="娃哈哈"):
print(a, b, food, c) chi("香蕉", "菠萝") # 香蕉 菠萝 () 娃哈哈 默认值生效
chi("⾹蕉", "菠萝", "葫芦娃") # ⾹蕉 菠萝 ('葫芦娃',) 娃哈哈 默认值生效
chi("香蕉", "菠萝", "葫芦娃", "口罩") # ⾹蕉 菠萝 ('葫芦娃', '口罩') 娃哈哈 默认值生效

这个时候我们发现所有的默认值都生效了.这个时候如果不给出关键字传参,那么你的默认值是永远生效的.

顺序:位置参数,动态参数*,默认值参数

2.动态接收关键字参数

在python中可以动态的位置参数,但是*这种情况只能接受位置参数无法接收关键字参数.

在python中使用**来接收动态关键字参数

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

这个时候接收的是一个dict

顺序的问题,在函数调用的时候,如果先给出关键字参数,则整个参数列表会报错.

def func(a, b, c, d):
print(a, b, c, d) # 关键字参数必须在位置参数后面, 否则参数会混乱
func(1, 2, c=3, 4)

所以关键字参数必须在位置参数后面.由于实参是这个顺序.所以形参接收的时候也是整个顺序,也就是说位置参数必须在关键字参数前面.动态接收关键字参数也要在后面

最终顺序(*):

位置参数>*args>默认值参数>**kwagrs


这四种参数可以任意的进行使用.

如果想接收所有的参数:

def func(*args, **kwargs):
print(args, kwargs) func("麻花藤","马晕",wtf="胡辣汤")

动态参数的另一种传参方式:

def fun(*args):
print(args) lst = [1, 4, 7]
fun(lst[0], lst[1], lst[2])
fun(*lst) # 可以使用*把⼀个列表按顺序打散 s = "臣妾做不到"
fun(*s) # 字符串也可以打散, (可迭代对象)

在实参位置上给一个序列,列表,可迭代对象前面加个*表示把这个序列按顺序打散.

在形参的位置上的*表示把接收到的参数组合成一个元组

如果是一个字典,那么也可以打散.不过需要两个*

def fun(**kwargs):
print(kwargs)
dic = {'a':1, 'b':2}
fun(**dic)

函数的注释:

def chi(food, drink):
"""
这里是函数的注释,先写一下当前这个函数是干什么的,比如我这个函数就是一个吃
:param food :参数是什么意思
:param drink:参数drink是什么意思
:return:返回的什么东东
"""
print(food,drink)
return "very good"

二.命名空间

在python解释器开始执行之后,就会在内存中开辟一个空间,每当遇到一个变量的时候,就把变量名和值之间的关系记录下来,但是当遇到函数定义的时候,

解释器只是把函数名读入内存,表示这个函数存在了,至于函数内部的变量和逻辑,解释器是不关心的.也就是说一开始的时候函数只是健在进来了,仅此而已,

只有当函数被调用和访问的时候,解释器才会根据函数内部的声明的变量来进行开辟变量的内部空间.随着函数执行完毕,这些函数内部变量占用的空间也会

随着函数执行完毕而被清空

def fun():
a = 10
print(a)
fun()
print(a) # a不存在了已经..

我们给存放名字和值的关系的空间起了一个名字叫:命名空间,我们的变量在储存的时候就是储存在这片空间中的

命名空间的分类:

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

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

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

加载顺序:

1.内置命名空间

2.全局命名空间

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

取值顺序:

1.局部命名空间

2.全局命名空间

3.内置命名空间

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

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

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

作用域命名空间:

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

2.局部作用域: 局部命名空间

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

def chi():
p = 30
print(locals()) # {'p': 30} locals()可以查看局部作用域中的内容
print(p)
# chi()
print(locals()) # 查看当前作用域中的名字
print(globals())

三.函数的嵌套

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

2.函数的执行顺序

# 一个套一个
def outer():
print("我是outer")
# 在函数内部声明的函数, 只能在函数内部访问
def inner():
print('我是inner')
inner()
print("我是outer_end") outer()
def fun2():
print(222)
def fun3():
print(666)
print(444)
fun3()
print(888)
print(33)
fun2()
print(555) # 33 222 444 666 888 555

四.关键字global和nonlocal

  首先我们写下这样一个代码,首先在全局声明一个变量,然后再局部调用这个变量,并改变这个变量的值

a = 10
def func():
global a # 直接从全局把变量引入进来
a = 20 # a = 20 # 并没有改变全局变量, 创建了一个自己的变量
# 全局变量在局部, 可以用, 但是, 不能改
# a = a + 10
print(a) func()
print(a)

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

nonlocal表示在局部作用域中,调用父级命名空间中的变量.

def outer():
a = 10
def inner():
nonlocal a
a = 20
print(a)
print(a) #
inner() #
print(a) #
outer()

再看如果嵌套了很多层,会是一种什么效果:

a = 1
def fun_1():
a = 2
def fun_2():
nonlocal a
a = 3
def fun_3():
a = 4
print(a)
print(a)
fun_3()
print(a)
print(a)
fun_2()
print(a)
print(a)
fun_1()
print(a) #

python学习 day10打卡 函数的进阶的更多相关文章

  1. Python学习笔记之常用函数及说明

    Python学习笔记之常用函数及说明 俗话说"好记性不如烂笔头",老祖宗们几千年总结出来的东西还是有些道理的,所以,常用的东西也要记下来,不记不知道,一记吓一跳,乖乖,函数咋这么多 ...

  2. Python学习笔记010——匿名函数lambda

    1 语法 my_lambda = lambda arg1, arg2 : arg1 + arg2 + 1 arg1.arg2:参数 arg1 + arg2 + 1 :表达式 2 描述 匿名函数不需要r ...

  3. [python学习] 语言基础—排序函数(sort()、sorted()、argsort()函数)

    python的内建排序函数有 sort.sorted两个. 1.基础的序列升序排序直接调用sorted()方法即可 ls = list([5, 2, 3, 1, 4]) new_ls = sorted ...

  4. python学习第十天 -- 函数

    稍微学过其他编程语言的人都应该了解函数的概念.在这里就不做过多的介绍. Python内置了很多有用的函数,我们可以也直接调用. 可以直接从Python的官方网站查看文档: http://docs.py ...

  5. python学习交流 - 内置函数使用方法和应用举例

    内置函数 python提供了68个内置函数,在使用过程中用户不再需要定义函数来实现内置函数支持的功能.更重要的是内置函数的算法是经过python作者优化的,并且部分是使用c语言实现,通常来说使用内置函 ...

  6. Python学习笔记(Ⅱ)——循环/选择/函数

    一.循环结构 python中提供了for循环和while循环两种操作,没有do……while语句. 1.for循环: 与其他语言中for循环的常见的写法如for (int i=0;i<10;i+ ...

  7. python学习笔记——高阶函数map()

    满足以下两点中任意一点,即为高阶函数: 1.函数接收一个或多个函数作为参数 2.函数返回一个函数 1 描述 用函数和可迭代对象中每一个元素作为参数,计算出新的迭代对象 map() 会根据提供的函数对指 ...

  8. python学习Day10 函数的介绍(定义、组成、使用)

    今日学习内容: 1.什么是函数 :函数就是一个含有特定功能的变量,一个解决某问题的工具 函数的定义:通过关键字def + 功能名字():代码体(根据需求撰写代码逻辑) 2.为什么要用函数:可以复用:函 ...

  9. python学习 day013打卡 内置函数

    本节主要内容: 内置函数: 内置函数就是python给你提供的.拿来直接用的函数,比如print,input等等.截止到python版本3.6.2 python一共提供了68个内置函数.他们就是pyt ...

随机推荐

  1. 转:C# 小数位数保留的方法集锦

    转载自:http://www.jb51.net/article/17010.htm 1. System.Globalization.NumberFormatInfo provider = new Sy ...

  2. 【JavaScript 6连载】二、函数(工厂模式)

    <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"& ...

  3. MyEclipse配置默认自带的Java代码格式化

    1.配置注释一大段代码块后,格式化代码,已经注释的代码仍然保持原样 (1)首先,Window -> Prefrences -> Java -> Code Style -> Fo ...

  4. 【开源】EasyFlash 新年发布 V4.0 beta 版,完全重写(转)

    [开源]EasyFlash 新年发布 V4.0 beta 版,完全重写 EasyFlash V4.0 beta [开源]嵌入式闪存库 EasyFlash for STM32,支持Env和IAP

  5. Torch或Numpy

    1.什么是NumpyNumpy系统是Python的一种开源的数值计算扩展,用python实现的科学计算包.这种工具可用来存储和处理大型矩阵,包括强大的N维数组对象Array,比较成熟的函数库等.num ...

  6. ELK学习笔记之F5 DNS可视化让DNS运维更安全更高效-F5 ELK可视化方案系列(3)

    0x00 概述 此文力求比较详细的解释DNS可视化所能带来的场景意义,无论是运维.还是DNS安全.建议仔细看完下图之后的大篇文字段落,希望能引发您的一些思考. 在“F5利用Elastic stack( ...

  7. php 获取今日、昨日、上周、本周、本月、上月、今年的起始时间戳和结束时间戳的方法

    //php获取今日开始时间戳和结束时间戳 $beginToday=mktime(0,0,0,date('m'),date('d'),date('Y')); $endToday=mktime(0,0,0 ...

  8. sync—WaitGroup

    用途:阻塞主线程的执行,直到所有的goroutine执行完成 WaitGroup总共有三个方法:Add(delta int),Done(),Wait().简单的说一下这三个方法的作用. Add:添加或 ...

  9. 【题解】Luogu P2319 [HNOI2006]超级英雄

    原题传送门 这道题就是一个很简单的二分图匹配 二分图匹配详解 一开始想的是2-sat和网络流,根本没想匈牙利和HK 这道题只要注意一点:当一个点匹配不成功之后就直接退出 剩下的就写个二分图最大匹配就行 ...

  10. JavaBean的getters和setters方法自动生成

    xgClass.java文件: public class XgClass { private String ccCityDerate1000Num; } 添加getter/setter方法: 在代码区 ...