python蟒蛇代码解析_巨蟒python全栈开发-第10天 函数进阶

2023-11-20 18:50

本文主要是介绍python蟒蛇代码解析_巨蟒python全栈开发-第10天 函数进阶,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.今日主要内容总览(重点)

1.动态传参(重点) *,**

*:

形参:聚合

位置参数*=>元组

关键字**=>字典

实参:打散

列表,字符串,元组=>*

字典=>**

形参顺序:

位置,*args,默认值,**kwargs

无敌传参:

def func(*args,**kwargs): #arguments参数, keyword-arguments关键字参数

pass

2.作用域和名称空间

名称空间:用来存放名字(变量,函数名,类名,引入的模块名字)的

1.全局名称空间:我们在py文件中自己写的变量,函数...

2.内置名称空间:我们python解释器提供好的一些内置函数(print,input...)

3.局部名称空间:在我们执行函数的时候,会产生一个局部名称空间.放的是:函数内部的内容(变量,函数,类...)

名称空间可能会有无数个,局部名称空间,相对是独立的,一般互不干扰

作用域:

1.全局作用域:内置+全局

2.局部作用域:局部

globals() 查看全局作用域

locals() 查看当前作用域

#函数调用完毕,函数开辟的空间自动关闭

#全局不能找局部的变量

#但是局部可以找全局

3.函数的嵌套

在函数中声明函数

在内部函数中使用变量的时候,查找顺序:先找自己=>上一层=>上一层..全局=>内置

4.nonlocal和global关键字(重点)

golbal:在局部引入全局变量

nonlocal:在局部...内层函数引入外层离他最近的那个变量

下周预习:

第一类对象(函数名,他就是个变量名),闭包,迭代器

生成器,各种推导式

内置函数1,内置函数2

装饰器(头疼),装饰器进阶

模块 //一个周

面向对象 //一个周

DAY10-函数进阶

二.今日内容大纲

1.动态传参

2.名称空间&作用域

3.函数的互相调用和函数的嵌套

4.nonlocal&global

三.内容详解

1.动态传参

(1)

分别传递给形参

defchi(zhushi,cai,fushi,tang,tiandian):print(zhushi,cai,fushi,tang,tiandian)

chi('大碗大米饭','火爆大头菜','把子肉','西红柿鸡蛋汤','烤地瓜')#吃不够灵活//

chi('小碗大米饭','火爆大头菜','','','')#参数不够报错或者必须这样写

'''结果:

大碗大米饭 火爆大头菜 把子肉 西红柿鸡蛋汤 烤地瓜

小碗大米饭 火爆大头菜'''

(2)

形参的顺序(重点)

位置参数 *args 默认值参数 **kwargs

以后写参数.可以随意的进行搭配,但是,顺序不能串

*在形参位置,*表示不定参数-接收的是位置参数

在接收到的位置参数的动态传参:都是元组

def chi(*food): #在形参这里把传递过来的实参进行了聚合,聚合成了元组

print(food)

chi('小米粥')

chi('小米粥','咸鸭蛋')

chi('爆米花','咸鸭蛋','辣白菜')

chi('小米粥','爆米花','咸鸭蛋','蒜茄子')'''结果:

('小米粥',)

('小米粥', '咸鸭蛋')

('爆米花', '咸鸭蛋', '辣白菜')

('小米粥', '爆米花', '咸鸭蛋', '蒜茄子')

(3)

位置参数放在前面,动态位置参数放在后边

解释后边的*args会聚合 4,5,6,7形成一个元组

def func(a,b,c,*args):print(a,b,c,args)

func(1,2,3,4,5,6,7)'''结果:

1 2 3 (4, 5, 6, 7)'''

(4)

动态位置参数放在前面,默认参数放在后边

def func(*args,a,b,c):print(a,b,c,args)

func(1,2,3,4,5,6,7,a=8,b=9,c=10)'''结果:#注意位置

8 9 10 (1, 2, 3, 4, 5, 6, 7)

(5)

key word arguments #关键字参数

**在形参中表示动态传参-关键字传递参数

关键字动态传参接收到的是字典

(5-1)

def func(**kwargs): #也是聚合 ** 聚合成字典

print(kwargs)

func(1,2,3,4,5)

'''

报错结果分析:(位置参数,报错)

表面上不报错,但是运行起来会报错

func() takes 0 positional arguments but 5 were given

func()采用0个位置参数,但给出了5个

(5-2)

def func(**kwargs): #也是聚合 ** 聚合成字典

print(kwargs)

func(a=1,b=2,c=3,haha='呵呵',good='not bad')#这里必须是关键字传参,不能是位置传参

'''# 结果:

{'a': 1, 'b': 2, 'c': 3, 'haha': '呵呵', 'good': 'not bad'}'''

(6)

#默认值不生效,下面两种写法都可以

正确写法def func(gender='男',**kwargs):print(gender,kwargs)

func(gender='女',a=5,b=6,c=7)

func('女',a=5,b=6,c=7)

错误写法def func(**kwargs,gender='男'):print(gender,kwargs)

func(gender='女',a=5,b=6,c=7)

func('女',a=5,b=6,c=7)

重点:

形式参数的顺序:

位置参数 *args 默认值 **kwargs

以后写参数,可以随意的进行搭配,但是必须按照上边的顺序

(7)

无敌传参案例

实参,不进行传递参数也是可以的

def func(*args,**kwargs): #参数没有限制,随便传递

print(args)print(kwargs)

func(1,2,3,4,5,a=3,b=5)

#结果:

(1, 2, 3, 4, 5)

{'a': 3, 'b': 5}

(8)

for循环只能纵向打散,不能横向打散

这里是形参 *代表聚合

(8-1)

def chi(*food):print(food)

lst=['胡萝卜','大白菜','大萝卜','草','果冻']#这里是实参 代表打散

chi(*lst)'''结果:('胡萝卜', '大白菜', '大萝卜', '草', '果冻')'''

(8-2)

def chi(*food):print(food)

lst=['胡萝卜','大白菜','大萝卜','草','果冻']for el inlst:

chi(el)'''# 结果:

# ('胡萝卜',)

# ('大白菜',)

# ('大萝卜',)

# ('草',)

# ('果冻',)'''

(8-3)

def chi(*food):print(food)

lst=['胡萝卜','大白菜','大萝卜','草','果冻']

chi(lst[0],lst[1],lst[2],lst[3],lst[4],)'''结果:('胡萝卜', '大白菜', '大萝卜', '草', '果冻')'''

(8-4)

字符串迭代元素换成元组

def chi(*food):print(food)

chi(*'你今天吃了什么') #打散,把列表,元组,字符串打散成位置参数进行传递

s='冬瓜'chi(s)

chi(*s)

chi('红鲤鱼','绿鲤鱼','驴')

结果:

结果:#字符串迭代元素换成元组

('你', '今', '天', '吃', '了', '什', '么')

('冬瓜',) #直接传是这样

('冬', '瓜') #聚合是这样

('红鲤鱼', '绿鲤鱼', '驴')

(8-5)

和8-4的最后一例一样

和8-4的最后一例一样def chi(*food):print(food)

chi('大白菜','大冬瓜')'''结果:('大白菜', '大冬瓜')'''

(9)

(9-1)#三种调用写法

def chi(**food): #聚合,聚合成字典

print(food)

dic={'主食':'面条','副食':'土豆泥','汤':'疙瘩汤'}

chi(**dic)

chi(**dic, 甜点="冰激凌") #打散. 打散成关键字

chi(主食="面条", 副食="土豆泥", 汤="疙瘩汤", 甜点="冰激凌")

chi(主食='面条',副食='土豆泥',汤='疙瘩汤')'''结果:

{'主食': '面条', '副食': '土豆泥', '汤': '疙瘩汤'}

{'主食': '面条', '副食': '土豆泥', '汤': '疙瘩汤', '甜点': '冰激凌'}

{'主食': '面条', '副食': '土豆泥', '汤': '疙瘩汤', '甜点': '冰激凌'}

{'主食': '面条', '副食': '土豆泥', '汤': '疙瘩汤'}'''

总结:

动态传参*总结:

形参:

*->元组,

**->字典 表示聚合

实参:

*->列表,字符串,元组

**->字典 表示打散

2.名称空间&作用域

(1)引入

a=10lst=[1,2,3,4]#内置函数print

print('你好啊,我叫盖伦')

(2)

defchi():

a= 10b= 20

# 如果不调用chi() chi中的a和b都不会创建

# 如果调用了chi() 会创建a,b变量,也就是两个小空间

chi()

(3)

defchi():

a= 10

print(a)

chi()print(a) #在没有其他条件的情况下,外部不可以调用内部变量,所有报错

(4)

def print(b):passa= 10

defchi():print(a)

chi()

总结:

从全局去找局部->找不到

局部去找全局-> 可以找到

(5)

名称空间可以有无数个

数据结构推荐:C严蔚敏

内置名称空间第一层,全局名称空间是第二层,局部名称空间是第三层

从第三层到第一层开始找

(6)

a=10b=20

def今天有是星期五了():pass今天有是星期五了()print(globals())

#查看全局作用域中的内容#globals 全局作用域:内置+全局名称空间

'''结果:

{'__name__': '__main__',

'__doc__': None,

'__package__': None,

'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000170913EB438>,

'__spec__': None,

'__annotations__': {},

'__builtins__': ,

'__file__': 'F:/Python_workspace_S18/day10 函数的进阶/04 名称空间和作用域.py',

'__cached__': None,

'a': 10, 'b': 20,

'今天有是星期五了': }'''

#自己写的全局变量:#'a': 10, 'b': 20,#'今天有是星期五了': }

(7)

defchi():

a=20b=30

#print(locals()) #查看当前作用域中的内容

print(globals())#alex,老男孩儿, 武sir, 全局作用域中的内容,在这里不显示a和b了

#我们可以知道不创建,在全局作用域内找不到局部作用域中的内容

chi()'''结果:

{'b': 30, 'a': 20}

{'__name__': '__main__',

'__doc__': None, '__package__': None,

'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000026EB5D4B438>,

'__spec__': None,

'__annotations__': {},

'__builtins__': ,

'__file__': 'F:/Python_workspace_S18/day10 函数的进阶/04 名称空间和作用域.py',

'__cached__': None,

'chi': }'''

#print(locals()) # 全局#print(globals()) # 全局

3.函数的互相调用和函数的嵌套

(1)函数的互相调用

deffunc1():print("我是神器的func1")deffunc2():

func1()print("我是神器的func2")deffunc3():print("我是神器的func3")#func5()

deffunc4():

func3()print("我是神器的func4")deffunc5():

func2()

func3()print("我是神器的func5")deffunc6():

func5()print("我是神器的func6")

func3()

func1()

func6()

结果:

'''结果:

我是神器的func1

我是神器的func2

我是神器的func3

我是神器的func5

我是神器的func6

我是神器的func3

我是神器的func1'''

(2)函数的嵌套

(2-1)

defouter():definner():print("我的天哪")print("还可以这样写???")

inner()

outer()'''结果:

还可以这样写???

我的天哪'''

#inner() # 在全局不能找到局部的内容,所以不能直接写在外边

(2-2)

ContractedBlock.gif

ExpandedBlockStart.gif

deffunc1():print("1")deffunc2():print("2")deffunc3():print("3")print("4")

func3()print(5)print("6")

func2()print("7")

func1()

View Code

结果:

ContractedBlock.gif

ExpandedBlockStart.gif

1

6

2

4

3

5

7

View Code

4.nonlocal&global

(1)

global是在内部修改全局

全局变量一般是不能随意的修改的

a = 10

deffunc():#慎用.

global a # 重点记忆:global 表示从全局把一个变量引入到局部, 后面使用的a都是全局变量

a += 10 #?? a = a + 10 # 现在的a是全局的, 你现在视图改全局变量

print("里面的打印",a)

func()print("外面的打印", a)'''结果:

里面的打印 20

外面的打印 20'''

(2)

nonlocal 在局部, 寻找离他最近的外层的一个变量

a = 50

deffunc1():

a= 10 #局部,如果这里没有a=10,会报错

deffunc2():

nonlocal a#不找全局,只能找外层函数中的, global找全局

a += 10 #a = a + 10 python不让这么干

print("func2", a)

func2()print(a)

func1()print(a)

结果:

func220

20

50

(3)

#不管是多少层.globals都是找全局里的

#全局变量一般是不能随意的修改的

#注意:nonlocal不能找全局变量

# nonlocal 在局部,寻找离他最近的外层的一个变量

# 如果没有nonlocal和global 查找的顺序: 自己, 上一层, 上一层, 上一层

deffunc1():

a=10 #局部

deffunc2():

nonlocal a

a=30

print('func2',a)

func2()print(a)

func1()'''结果:

func2 30

30'''

(4)真假难辨,这种题都能做出来,还有什么题目不能做出来

a = 1

deffun_1():

a= 2

deffun_2():

nonlocal a

a= 3

deffun_3():

a= 4

print(a)print(a)

fun_3()print(a)print(a)

fun_2()print(a)print(a)

fun_1()print(a)

结果:

ContractedBlock.gif

ExpandedBlockStart.gif

结果:1

2

3

4

3

3

1

View Code

(5)折叠调用

deflogin():globalflag

uname= input("用户名:")

upwd= input("密码:")if uname == "alex" and upwd == "123":

flag=Trueelse:

flag=Falsedeffatie():if flag ==True:print("可以发帖")else:print("滚去登录")

login()

fatie()

今日作业:

2,写函数,接收n个数字,求这些参数数字的和。(动态传参)

ContractedBlock.gif

ExpandedBlockStart.gif

方法一:def digit_sum(*args):print(sum(args))

digit_sum(1,2,3,4,5)

方法二:def digit_sum(*args):

sum=0for i inargs:

sum+=iprint(sum)

digit_sum(1,2,3,4,5)

View Code

3,读代码,回答:代码中,打印出来的值a,b,c分别是什么?为什么?

a=10

b=20

def test5(a,b):

print(a,b)

c = test5(b,a) #c代表的是返回值

print(c)

ContractedBlock.gif

ExpandedBlockStart.gif

a是20

b是10

c是None

结果是:20 10None

View Code

4,读代码,回答:代码中,打印出来的值a,b,c分别是什么?为什么?

a=10

b=20

def test5(a,b):

a=3

b=5

print(a,b)

c = test5(b,a)

print(c)

print(a,b)

打印出来的结果

a是3 b是5

None

a是10 b是20

5,写函数,传入函数中多个实参(均为可迭代对象如字符串,列表,元祖,集合等),

将每个实参的每个元素依次添加到函数的动态参数args里面.

例如 传入函数两个参数[1,2,3] (22,33)最终args为(1,2,3,22,33)

这里必须要对列表或者元组进行打散才可以def pa(*args): #1

#print(args)

return args #2#a=pa([1,2,3],(22,33)) #结果:([1, 2, 3], (22, 33))

x=[1,2,3] #3

y=(22,33) #4

a=pa(*x,*y) #5

print(a) #6

6,写函数,传入函数中多个实参(实参均为字典),

将每个实参的键值对依次添加到函数的动态参数kwargs里面.

例如 传入函数两个参数{‘name’:’alex’} {‘age’:1000}

最终kwargs为{‘name’:’alex’ ,‘age’:1000}

#注意,必须要接受参数

def a(**kwargs):returnkwargs

x={'name':'alex'}

y={'age':1000}

b=a(**x,**y)print(b)

7, 下面代码成立么?如果不成立为什么报错?怎么解决?

7.1a= 2

defwrapper():print(a)

wrapper()#正确

7.2a= 2

defwrapper():

a+= 1

print(a)

wrapper()#错误,在赋值前引用全局变量a

修改后的程序

a= 2

defwrapper():globala

a+= 1

print(a)

wrapper()7.3

defwrapper():

a= 1

definner():print(a)

inner()

wrapper()#正确

7.4

defwrapper():

a= 1

definner():

a+= 1

print(a)

inner()

wrapper()#错误,在赋值前引用全局变量a

#修改后的结果

defwrapper():

a= 1

definner():

nonlocal a

a+= 1

print(a)

inner()

wrapper()

8,写函数,接收两个数字参数,将较小的数字返回.

deffunc(a,b):if a>b:returnbelse:returna

x=func(2,3)print(x)

9,写函数,接收一个参数(此参数类型必须是可迭代对象),

将可迭代对象的每个元素以’_’相连接,形成新的字符串,并返回.

例如 传入的可迭代对象为[1,'老男孩','武sir']返回的结果为’1_老男孩_武sir’

deffunc(x):

s=''

for i inx:

i=str(i)

s+=i +"_"

return s.strip('_')

a=func([1,'老男孩','武sir'])print(a)

10,写函数,传入n个数,返回字典{‘max’:最大值,’min’:最小值}

例如:min_max(2,5,7,8,4) 返回:{‘max’:8,’min’:2}(此题用到max(),min()内置函数)

def func(*args):return {'max':max(args),'min':min(args)}

a=func(*(2,5,7,8,4))print(a)

11,写函数,传入一个参数n,返回n的阶乘

例如:cal(7) 计算7*6*5*4*3*2*1

defcal(n):if n==0:return 1

return n * cal(n - 1)

a=cal(3)print(a)

12写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组

例如:[(‘红心’,2),(‘草花’,2), …(‘黑桃’,‘A’)]

defpuke():

a=['红心','草花','梅花','黑桃']

b=[2,3,4,5,6,7,8,9,10,'J','Q','K','A']

lst=[]for i inb:for k ina:

lst.append((k,i))returnlst

a=puke()print(a)

13 有如下函数:

def wrapper():

def inner():

print(666)

wrapper()

你可以任意添加代码,用两种或以上的方法,执行inner函数.

方法一defwrapper():definner():print(666)

inner()

wrapper()

方法二defwrapper():definner():print(666)returninner

wrapper()()

14相关面试题(先从纸上写好答案,然后在运行):

1,有函数定义如下:

def calc(a,b,c,d=1,e=2):

return (a+b)*(c-d)+e

请分别写出下列标号代码的输出结果,如果出错请写出Error。

print(calc(1,2,3,4,5))__2___

print(calc(1,2))__Error__

print(calc(e=4,c=5,a=2,b=3))_24__

print(calc(1,2,3))__8___

print(calc(1,2,3,e=4))__10__

print(calc(1,2,3,d=5,4))__Error___

2,(此题有坑)下面代码打印的结果分别是__[10,'a']___,__[123]___,___[10,'a']__.

def extendList(val,list=[]):  #多次调用使用同一个列表

list.append(val)     #把元素添加到列表,然后返回列表

return list

list1 = extendList(10)

list2 = extendList(123,[])

list3 = extendList('a')

print('list1=%s'%list1)

print('list2=%s'%list2)

print('list3=%s'%list3)

3, 写代码完成99乘法表.(升级题)

1 * 1 = 1

2 * 1 = 2 2 * 2 = 4

3 * 1 = 3 3 * 2 = 6 3 * 3 = 9

......

9 * 1 = 9 9 * 2 = 18 9 * 3 = 27 9 * 4 = 36 9 * 5 = 45 9 * 6 = 54 9 * 7 = 63 9 * 8 = 72 9 * 9 = 81

'''

双for循环实现:

for i in range(1,10):for j in range(1,i+1):

r=i*jprint('%s*%s=%s'%(i,j,r),' ',end='')print()

这篇关于python蟒蛇代码解析_巨蟒python全栈开发-第10天 函数进阶的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/396701

相关文章

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相