python入门系列:函数
引言
将一段代码集中到一块,起一个名字,下次可以根据这个名字再次使用这个代码块。
作用:
方便代码重用
分解任务,简化程序逻辑
使代码更加模块化
函数的参数
所有的传参方式都是传引用,注意列表做参数和数值做参数容易出现的问题。
单个参数
多个参数
定义方式
def funName(arg1, arg2, arg3...):
pass
调用方法
funName(arg1, arg2, arg3...) # 形参和实参一一对应
funName(arg2=v2, arg3=v3, arg1=v1) # 指明形参的名称,不用严格按照形参顺序
不定长参数
1. 利用元组的拆包装包
def mySum(args):
print(type(args)) # <class 'tuple'>
print(args) # (1, 2, 3, 4)
print(args) # 拆包操作 1, 2, 3, 4
for v in args:
todo ...
"""
装包,将传入的参数装入一个元组中,args就成了一个元组对象
拆包,将一个元组中的元素拆分出来,*args就成了参数序列
"""
2. 利用字典的键值对
def myInfo(**args):
print(type(args)) # <class 'dict'>
todo ...
myInfo(name="MetaTian", age=21)
默认参数
"""
调用某些函数时,可以省略某些参数,采用定义函数时指定的值
若不省略,则以调用时传入的值为准
"""
def sorted(iterable, reverse=False):
pass
new_list = sorted([1, 3, 2, 5])
new_list = sorted([1, 3, 2, 5], True)
返回值
返回语句标志着函数的结束,一个函数最好只有一处返回语句
如果想返回多个数据,可以把数据包装成一个集合,整体返回(列表,元组,字典...)
def funName():
data = {}
todo...
return data
偏函数
对于一个默认值较多的函数,有时我们需要重复用到其中的部分默认值,每次指定默认值比较麻烦。
可以将其中的默认值先赋值好,然后封装成一个新的函数,这就是偏函数。
import functools
numStr = "100010"
res = int(numStr, base=2)
print(res) # 34
int2 = functools.partial(int, base=2) # 重新封装,构成偏函数
print(int2(numStr)) # 34
高阶函数
一个函数的参数可以是另外一个函数
def calculate(a, b, cal_fun):
print(cal_fun(a, b))
def sum(a, b):
return a + b
def sub(a, b):
return a - b
calculate(2, 3, sum) # 5
calculate(2, 3, sub) # -1
匿名函数
lambda表达式
没有名字的函数
"""
lambda arguments: expression
冒号前面是参数,后面是要返回的表达式
"""
res = (lambda x, y : x + y)(1, 2)
print(res) # 3
fun = lambda x, y : x + y
print(fun(2, 3)) # 5
更多的是配合 map(), reduce()等函数进行使用
闭包
在函数嵌套定义的前提下
内层函数引用了外层函数的变量
外层函数把内层函数当做返回值
def line_config(content, length):
define line():
print(content * length)
return line
line1 = line_config("-", 5);
line2 = line_config("*", 6)
line1(); # -----
line2(); # **
作用域问题:内层函数要修改外层函数的变量,要使用nonlocal进行声明,否则变量属于内层函数。
def test():
num = 10
def test2():
nonlocal num # test中的 num被修改
num = 666
return test2
当内层函数使用外层的变化量时,注意值的情况
def test():
funs = []
for i in range(1, 4):
def test2():
print(i)
funs.append(test2)
return funs
"""
函数在运行时才会去确定变量的值
运行时,索引 i 的值因定义时迭代完成,不再发生变化
细节请参考迭代器部分
"""
myFuns = test()
myFuns[0]() # 3
myFuns[1]() # 3
myFuns[2]() # 3
装饰器
在调用目标函数之前,对这个函数对象进行装饰(增加一些其他功能)。
函数的名字不能改变。
函数体内部的代码不能发生改变。
使用案例
def check(func):
def inner():
print("登录验证...")
func()
return inner()
在 fss()和 ftp()执行之前,都会送入 check()进行包装
@check # 只要python解释器执行到了这行代码就会进行装饰执行
def fss():
print("发说说")
上面三行等价于 fss = check(fss)
@check
def ftp():
print("发图片")
上面三行等价于 ftp = check(ftp)
主业务逻辑如下:
flag = 1
if flag == 1:
fss() # 登录验证...
else: # 发说说
ftp()
多个装饰器的调用顺序
def one(func):
print('----1----')
def two():
print('----2----')
func()
return two
def a(func):
print('----a----')
def b():
print('----b----')
func()
return bbr/>@one
@a
def demo():
print('----3----')
demo()
运行结果 //从下到上装饰,从上到下执行,分析略
----a----
----1----
----2----
----b----
----3----
对带有参数的函数进行装饰
def zsq(funcs):
def inner(*args, kwargs): # 装包
print("-" 5)
func(args, kwargs) # 拆包
return innerbr/>@zsq
def fun1(n1, n2, n3):
print(n1, n2, n3)
@zsq
def fun2(n):
print(n)
fun1(1, 2, n3=8) # 1 2 8
fun2(3) # 3
对带有返回值的函数进行装饰
def zsq(funcs):
def inner(*args, kwargs): # 装包
print("-" 5)
res = func(args, kwargs) # 拆包
return res
@zsq
def fun1(n1, n2, n3):
return sum(n1, n2, n3)
fun1(1, 2, 3)
带有参数的装饰器
def getzsq(char):
def zsq (func):
def inner():
print(char * 5)
func()
return inner
return zsq
@getzsq("*")
def f(): # *****
print("666") # 666
@getzsq("-")
def f1(): # -----
print("666") # 666
生成器
是一个特殊的迭代器
特性:
惰性计算数据,节省内存
能够记录状态,通过next()函数,访问下一个状态
使用方式
生成器表达式,不是元组推导,没有元组推导式
l = (i for i in range(1, 10000000) if i % 2)
print(type(l))
print(next(l)) # 1
print(next(l)) # 3
for i in l:
print(i) # 循环打印出所有满足条件的值
生成器函数
def test():
for i in range(1, 9):
yield i
g = test()
print(next(g)) # 1
print(next(g)) # 2
注:喜欢python + qun:839383765 可以获取Python各类免费最新入门学习资料!
转载于:https://blog.51cto.com/14186420/2349767
python入门系列:函数相关推荐
- 十二章 Python入门系列之字典
系列文章目录 第一章 Python入门系列之介绍 第二章 Python入门系列之PyCharm 第三章 Python入门系列之注释 第四章 Python入门系列之变量 第五章 Python入门系列之输 ...
- 【Python入门系列】一个简单的数据分析问题——用Pandas揭秘美国选民的总统喜好
阿里天池训练营学习笔记 学习链接~AI训练营Python 本文将展示一个实际操作,利用Pandas对美国大选的一些数据进行处理,题目的详细内容请点击此处~[Python入门系列]用Pandas揭秘美国 ...
- 第八章 Python入门系列之循环
系列文章目录 第一章 Python入门系列之介绍 第二章 Python入门系列之PyCharm 第三章 Python入门系列之注释 第四章 Python入门系列之变量 第五章 Python入门系列之输 ...
- 视频教程-Python入门-系列游戏开发/太空阻击-Python
Python入门-系列游戏开发/太空阻击 20年软件项目开发管理经验 工信部人才交流中心特聘专家讲师 日本U-CAN在线教育特聘主任讲师 国家十二·五规划软件工程教材作者(书:清华大学出版社出版) 中 ...
- 10分钟带你了解python_10分钟Python入门系列教程及学习资源分享
本期分享笔记内容 归档此前入门教程文章,方便查看 10分钟带你Python入门的特点 简单谈下如何寻找Python学习资源 关于分享Python学习资源的分享问题 本人对于Python学习创建了一个小 ...
- python入门系列:迭代器和生成器
python的迭代协议 引言 迭代器是访问集合内部元素的一种方式,一般用来遍历数据. 迭代器和用下标索引访问的方式不一样,迭代器是不能直接返回值的. 迭代器提供了一种惰性访问数据的方式,需要的时候才产 ...
- Python 入门 之 函数
Python 入门 到 精通 (四) 函数基本知识 递归函数 Lambda(匿名函数) 实例运用 本篇文章重点讲解 Python 函数 的以下内容: 定义函数语法.调用函数.函数参数.参数的传递方式. ...
- python入门系列1——用Beep函数手动实现7个音符的播放
今天学了python,参考练习题,本来是找倍数的,但是想到找到之后发个提示音岂不是很有意思,然后就找到了这个函数,进而想到做个7阶音符玩玩. 7个音符差别在哪 关于乐理知识就不过多介绍了,我也是一个音 ...
- 音乐python播放函数-python入门系列1——用Beep函数手动实现7个音符的播放
今天学了python,参考练习题,本来是找倍数的,但是想到找到之后发个提示音岂不是很有意思,然后就找到了这个函数,进而想到做个7阶音符玩玩. 7个音符差别在哪 关于乐理知识就不过多介绍了,我也是一个音 ...
最新文章
- Hardware Error 内存报错
- 大学生学python到底有没有有-除了不会生孩子,Python还有啥不会的呢
- 第一章 Joomla!扩展开发:概况
- 服务器系统功能描述,Hadoop mapreduce核心功能描述
- FreeSWITCH 下载地址
- java 保存和读取本地文件
- 打开计算机管理提示找不到文件,Win8系统打开计算机管理提示找不到文件怎么解决...
- unity摄影机depth模式_[蛮牛教程] Unity3D 浅析-Camera(摄像机)
- Java语言开发的开源商城系统——Javashop简介
- linux 上u盘打不开了,U盘打不开怎么办-八种方法汇总
- crc8校验c语言程序,单片机CRC8检验C语言实现
- Layabox的2d精灵的性能优化
- excel制作随着日期的改变而变化的动态日历
- 蓝色主题登陆页面界面模板
- 最新RiPro6.3.8 wordpress主题最新版完整修复去后门和加密文件
- WIN10无法启动(启动画面转圈卡死)的解决方法
- 计算机会计系统与手工会计系统有什么异同,会计电算化系统与手工会计系统的比较研究...
- [Minecraft]基于Forge的1.8.9MOD开发教程——第二讲:创建一个空Mod
- 计算机图形学之光线跟踪算法的研究与实现2017年我的优秀毕业论文
- 64位 regsrv win10_win10 专业版 64位 系统 频繁蓝屏,MEMORY_MANAGEMENT - Microsoft Community...