博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
函数(二)
阅读量:5055 次
发布时间:2019-06-12

本文共 3139 字,大约阅读时间需要 10 分钟。

一、命名关键字参数

命名关键字参数:在函数定义阶段,写在*与**可变长参数之间的形参

在给命名关键字参数传值得时候,只能用关键字为其传值

def func(x,y=1,*args,z=3,m,**kwargs):    print(x,y)    print(args)    print(z,m)    print(kwargs)func(1,2,1,2,3,4,5,6,7,78,8,9,0,z=69,m=999,o=666999,l = 999666)

在定义阶段,给你感觉好像是z是默认值参数,放在了m这个位置参数的前面了,应该报错。但其实z和m都是命名关键字参数,不是默认值参数和位置参数。

二、函数对象

1.函数名可以被传递

def func():     print('form func')print(func)print(id(func))f = funcfunc()print(f)f()#其实指向的也是函数func指向函数体代码的内存地址

2.函数名可以被当做参数传递给其他函数

def func():    print('form func')def index(arg):    print(arg)    arg()    print('form index')index(func)

3.函数名可以被当做函数的返回值

def func():    print('form func')def index(arg):    print(arg)    arg()    print('form index')# index(1)index(func)

4.函数名可以被当做容器类型的参数

def func():    print('func')print(func())l = [1,2,func,func()]print(l)

利用函数做一个购物车功能:

1 def register(): 2     print('register') 3 def login(): 4     print('login') 5 def shopping(): 6     print('shopping') 7 def pay(): 8     print('pay') 9 10 msg = '''11 1.注册12 2.登录13 3.购物14 4.支付15 '''16 17 while True:18    print(msg)19    choose = input('choose>>>:')20    if choose == '1':21        register()22    elif choose == '2':23        login()24    elif choose == '3':25        shopping()26    elif choose == '4':27        pay()28    else:29        print('此功能暂未开放')

三、函数的嵌套调用

在函数内部调用其他函数

可以将复杂的逻辑简单化

def index():    func()    print('index')def func():    print('func')index()

嵌套函数应用场景:比较多个数的大小

1 def my_max(x,y): 2     if x > y: 3         return x 4     return y 5  6 def my_max4(a,b,c,d): 7     res = my_max(a,b) 8     res1 = my_max(res,c) 9     res2 = my_max(res1,d)10     return res211 print(my_max4(1,30,21,5))

四、函数的嵌套定义

1 def outer():2     print('outer')3     def inner():4         print('inner')5     return inner6 res = outer()7 print(res)8 res()

应用场景:

写一个函数:该函数用户可以通过传参的不同控制函数执行不同的功能

1 def shopping(type): 2     def register(): 3         print('register') 4     def login(): 5         print('login') 6     def buy(): 7         print('buy') 8     def pay(): 9         print('pay')10     if type == 1:11         register()12     if type == 2:13         login()14     if type == 3:15         buy()16     if type == 4:17         pay()

这样用户只需要在shopping()括号内输入相应数字,即可完成相应操作。

五、名称空间

名称空间就是存放名字的地方,存放的是变量名与变量值的内存地址的绑定关系的地方,想要访问一个变量的值,必须先去名称空间中拿到对应的名字,才能够访问变量的值。

名称空间的分类:

1.内置空间名称:python解释器提前给你定义好的名字(已经放置到内置名称空间中了)

   len

   max

   min

2.全局名称空间:文件级别的代码

   x == 1

   if 1 == 1:

       y = 2

x,y,z都会放到全局名称空间

if for while 无论嵌套多少层,他们内部所创建的名字都是都是全局名称空间

3.局部名称空间:函数体内创建的名字都属于局部名称空间

生命周期:

内置名称空间:只要python解释器已启动立马创建 关闭python解释器的时候内置名称空间自动

全局名称空间:只要你右键运行py文件会自动创建 py文件程序运行结束自动销毁

局部名称空间:函数被调用的时候自动创建 函数指向结束立即销毁(动态创建动态销毁)

六、名称空间的查找顺序

首先你要确定你当前的位置在哪儿(大前提)

如果站在全局:全局>>>内置

如果站在局部:局部>>>全局>>>内置

强调:函数在定义阶段查找名字的顺序就已经固定了,不会因为函数的调用位置变化而改变了。

七、作用域

全局作用域

全局有效:内置名称空间,全局名称空间

局部作用域

局部有效:局部名称空间

1.global 在局部修改全局的不可变数据类型

x =1username = 'jason'def func():    global x,username  # 修改全局变量 而不是创建局部名称空间    x = 999    username = 'zzj'func()print(x)print(username)

2.nonlocal  局部修改局部

def func():    x = 1    def index():        nonlocal x        x = 2    index()    print(x)func()

global:局部修改全局 如果想修改多个 逗号隔开

nonlocal:局部修局部 如果想修改多个 逗号隔开

转载于:https://www.cnblogs.com/spencerzhu/p/11165249.html

你可能感兴趣的文章
socket
查看>>
日志框架--(一)基础篇
查看>>
Java设计模式之原型模式
查看>>
哲理故事与管理之道(20)-用危机激励下属
查看>>
关于源程序到可运行程序的过程
查看>>
转载:mysql数据库密码忘记找回方法
查看>>
scratch少儿编程第一季——06、人在江湖混,没有背景怎么行。
查看>>
面向对象1
查看>>
在ns2.35中添加myevalvid框架
查看>>
【贪心+DFS】D. Field expansion
查看>>
C# Async与Await的使用
查看>>
Mysql性能调优
查看>>
iOS基础-UIKit框架-多控制器管理-实例:qq界面框架
查看>>
IOS-每个程序员的编程之路上都应该看这11本书
查看>>
自定义tabbar(纯代码)
查看>>
小程序底部导航栏
查看>>
ibatis学习笔记
查看>>
18-ES6(1)
查看>>
poj1611 简单并查集
查看>>
Ubuntu 14.04下安装CUDA8.0
查看>>