[PY3]——Python的函数
Python函数总结图

1.调用
1.1 如何调用
1.1.1 函数名(传参)
# 函数使用函数名来调用,函数名后紧跟一对小括号,小括号里传入函数定义时要求的参数
add(9,9)
#9+9=18
1.2 传参
1.2.1 传参方法1:位置参数
1.2.2 传参方法2:关键字参数
def add(x,y):
ret=x+y
print('{}+{}={}'.format(x,y,ret))
return ret # 传参方法1:位置参数 指参数按照定义的顺序传入
add(8,9)
#8+9=17 # 传参方法2:关键字参数 指参数按照定义时的变量名传入
add(x=9,y=8)
#9+8=17 # 规则1:位置参数和关键字参数可以混合使用
add(3,y=9)
#3+9=12 # 规则2:但混合使用时,位置参数必须在前面,否则SyntaxError
add(x=3,9)
#SyntaxError: positional argument follows keyword argument # 注意1:
add('','')
#3+9=39 # 注意2:传入参数必须和函数定义时的参数相匹配,如果不匹配会抛出TypeError
add(9,9,9)
#TypeError: add() takes 2 positional arguments but 3 were given
1.3 参数解构
1.3.1 位置参数解构:*可迭代对象
1.3.2 关键字参数解构:*字典
iter=[3,9]
add(iter[0],iter[1])
#3+9=12 # 位置参数解构:*可迭代对象 可以把可迭代对象解构成位置参数
add(*iter)
#3+9=12
add(*range(2))
#0+1=1 # 关键字参数解构:*字典 可以把字典解构成关键字参数
# 关键字参数解构,key必须是str
dict={'x':3,'y':9}
add(**dict)
#3+9=12
2. 函数定义
2.1 如何定义
def 函数名(参数列表):
执行语句
return 返回值
def add(x, y): # 函数定义 def 表示定义一个函数;紧接着是函数名,函数名后面用一对小括号列出参数列表;参数列表后面使用一个冒号开始函数体
print(x + y) # 函数体是正常的Python语句,可以包含任意结构
return x + y # return语句表示函数的返回值
2.2 函数的参数
2.2.1 普通参数
2.2.2 默认参数
2.2.3 可变参数(*变量 **变量)
2.2.4 keyword-only参数
2.2.5 参数设置规则
# 可以为参数设置默认值,调用时如果不传递此参数,会使用默认值
def inc(x,y=9):
print(x+y) inc(1,10)
#11 inc(1)
#10
# 位置可变参数:*变量 构成元祖,以位置参数的形式传参
def sum(*lst):
print(type(lst))
ret=0
for x in lst:
ret+=x
print(ret) sum(1,2,3,4,5)
#<class 'tuple'>
#15
sum(1,2,3)
#<class 'tuple'>
#6 # 关键字可变参数:**变量 构成字典,以关键字参数的形式传参
def connect(**kwargs):
print(type(kwargs))
for k,v in kwargs.items():
print('{}——>{}'.format(k,v)) connect(host='127.0.0.1',port=3306)
#<class 'dict'>
#host——>127.0.0.1
#port——>3306 # 所以如果要创建一个接受任意类型参数的函数,可以如何定义?
def wrap(*args,**kwargs)
# 规则1:普通参数和可变参数可以一起使用,但传参必须匹配
def fn(x,y,*args,**kwargs):
print("x=",x)
print("y=",y)
print("args=",args)
print("kwargs=",kwargs) fn(1,2)
#x= 1
#y= 2
#args= ()
#kwargs= {} fn(1,2,0,2,6,a=3,b=9)
#x= 1
#y= 2
#args= (0, 2, 6)
#kwargs= {'b': 9, 'a': 3} fn(2,y=3)
#x= 2
#y= 3
#args= ()
#kwargs= {} fn(2,3,6,9,x=1)
#TypeError: fn() got multiple values for argument 'x' # 规则2:位置可变参数如果放普通参数之前,普通参数会变成keyword-only参数
def fn(*args,x):
pass
fn(2,3,0)
#TypeError: fn() missing 1 required keyword-only argument: 'x' # 规则3:而关键字可变参数就不能在普通参数|默认参数之前
def fn(**kwargs,x):
pass
#SyntaxError: invalid syntax def fn(**kwargs,x=9):
pass
#SyntaxError: invalid syntax
# 规则4:不建议可变参数和默认参数一起使用
def fn(*args,x=5):
print(args)
print(x)
fn(1,2,3)
#(1, 2, 3)
#5 def fn(x=5,*args):
print(x)
print(args)
fn(1,2,2)
#1
#(2, 2) # 规则5:位置可变参数和关键字可变参数可以同时使用,但位置可变参数必须在前面
def fn(*args,**kwargs):
print(args)
print(kwargs)
fn(1,2,3,a=3,b=9)
#(1, 2, 3)
#{'a': 3, 'b': 9} def fn(**kwargs,*args,):
pass
#SyntaxError: invalid syntax
3. 函数返回值
# 返回值除了返回值的作用外,还会结束函数,return后的语句将不会被执行
# 所以有结束函数作用的需求时,可以直接写“return”即可
def add(x,y):
return x+y
print("test") print(add(3,9))
#12
# 一个函数可以有多个return,执行到哪个就由哪个返回并结束
def guess(x):
if x>3:
return '>3'
print('end')
return '<=3'
print('end')
print(guess(3))
#<=3
print(guess(9))
#>3
# return可以提前结束循环
# 没有return返回None
def fn(x):
for i in range(x):
if i>=3:
return i
else:
print('not bigger than 3')
print(fn(10))
#3
#not bigger than 3 print(fn(2))
#None # return多个值时,可以用封装把返回值封装成一个元组、用解构来获取
def fn():
return 3,5
print(type(fn()))
#<class 'tuple'> x,y=fn()
print(x,y)
#3 5
4.函数作用域
4.1 上下级作用域的变量的关系
# 函数内部是一个局部作用域,对上级作用域(全局作用域)的变量x ——>只读可见,不可操作
x=1
def inc():
x+=1
inc()
#UnboundLocalError: local variable 'x' referenced before assignment def inc():
print(x)
inc()
#1
def fn():
xx=1
print(xx)
def inner():
print(xx) #上级作用域的变量对下级作用域是可见的
inner()
fn()
#1
#1 def fn():
xx=1
print(xx)
def inner():
xx=2 #在inner()作用域内定义的变量,那就只对该内部作用域及其下级作用域可见
print(xx)
inner()
print(xx)
fn()
#1
#2
#1
4.2 global 标记全局变量
#global 全局变量
xx=2
def fn():
global xx #将上级作用域的xx变量标记为全局变量
xx+=1 #则可对它操作了
fn()
print(xx)
#3 def fn():
global aa=1 #注意global只能标记,并不能定义变量
aa+=1
fn()
#SyntaxError: invalid syntax #除非你清楚的知道global会带来什么,并且明确的知道,非global不行, 否则不要使用global
4.3 nonlocal
def fn():
xx=1
print(xx)
def inner():
xx+=1 #对上级作用域定义的xx,原本是不可操作或定义的
print(xx)
inner()
fn()
#UnboundLocalError: local variable 'xx' referenced before assignment def fn():
xx=1
print(xx)
def inner():
nonlocal xx #nonlocal可以标记上一级作用域变量,使它可读可写
xx+=1
print(xx)
inner()
fn()
#1
#2
5. 匿名函数(lambda)
5.1 lambda 可以怎样被定义和使用
lambda x:x+1
#<function __main__.<lambda>> print((lambda x:x+1)(5))
# f=lambda x:x+1
print(f(5))
# # 匿名函数(lambda表达式) 只能写在一行上所以也有人叫它单行函数
f=lambda x: if x <0:
0
else:
0
#SyntaxError: invalid syntax
5.2 lambda支持所有的参数列表及规则
# 匿名函数支持所有普通函数所支持的参数列表及规则
print((lambda :0)())
# print((lambda x,y:x+y)(3,5))
# print((lambda *args:args)(*range(3)))
#(0, 1, 2) print((lambda *args,**kwargs:print(args,kwargs))(*range(3),**{str(x):x for x in range(3)}))
#(0, 1, 2) {'0': 0, '2': 2, '1': 1}
5.3 lamdba常和sorted( )等高阶函数一起使用
# 匿名函数通常用于高阶函数的参数,当此函数非常短小的时候,就适合使用匿名函数
6. 生成器函数(yield)
def gen():
print('a')
yield 1
print('b')
yield 2
return 3 g=gen() print(g)
#<generator object gen at 0x7f144845a308> print(next(g))
#a
#1 print(next(g))
#b
#2 print(next(g))
#StopIteration: 3 # 带yield语句的函数称之为生成器函数, 生成器函数的返回值是生成器
* 生成器函数执行的时候,不会执行函数体
* 当next生成器的时候, 当前代码执行到之后的第一个yield,会弹出值,并且暂停函数
* 当再次next生成器的时候,从上次暂停处开始往下执行
* 当没有多余的yield的时候,会抛出StopIteration异常,异常的value是函数的返回值
更多关于生成器参考:《[PY3]——函数——生成器(yield关键字)》
7. 函数执行流程
[PY3]——Python的函数的更多相关文章
- Python之函数作业
Python之函数作业 爬页面 #爬虫页面,send一次爬一次 from urllib.request import urlopen def get(): while True: url = yiel ...
- python基础,函数,面向对象,模块练习
---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? # [] {} () None 0 2,位和字节的关系? # ...
- python的函数
函数一词起源于数学,但是在编程中的函数和数学中的有很大不同.编程中的函数式组织好的,可重复使用的,用于实现单一功能或相关联功能的代码块. 我们在学习过程中已经使用过一些python内建的函数,如pri ...
- python strip()函数 介绍
python strip()函数 介绍,需要的朋友可以参考一下 函数原型 声明:s为字符串,rm为要删除的字符序列 s.strip(rm) 删除s字符串中开头.结尾处,位于 rm删除 ...
- python split()函数
Python split()函数 函数原型: split([char][, num])默认用空格分割,参数char为分割字符,num为分割次数,即分割成(num+1)个字符串 1.按某一个字符分割. ...
- Python数学函数
1.Python数学函数 1.abs(x):取绝对值,内建函数 2.math.ceil(x):向上取整,在math模块中 3.cmp(x,y):如果 x < y ,返回-1:如果 x == y ...
- Python回调函数用法实例详解
本文实例讲述了Python回调函数用法.分享给大家供大家参考.具体分析如下: 一.百度百科上对回调函数的解释: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函 ...
- Python之函数与变量
本节内容 函数介绍及其作用 函数的定义与调用 函数的参数说明 全局变量与局部变量 值传递和引用传递 一.函数的介绍及其作用 编程语言中的函数与数学中的函数是有区别的:数学中的函数有参数(输入),就会有 ...
- Python基础-函数篇
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 函数与函数式编程 1.面向对象: 华山派-- ...
随机推荐
- [Erlang36]kerl轻松管理安装各种OTP版本
kerl只有一个目标:让我们在不同的OTP版本间随意切换.他是一个纯Bash项目.简单实用的工作利器! Readme里面用法已说明得非常清楚了.建议按流程来一次. 1.下载 安装(一个bash脚本,根 ...
- 分布式流式计算平台——S4
本文是作者在充分阅读和理解Yahoo!最新发布的技术论文<S4:Distributed Stream Computing Platform>的基础上,所做出的知识分享. S4是Yahoo! ...
- EasyUI DataGrid 使用(分页,url数据获取,data转json)
EasyUI算是比较有名的,搜一下网上的资料也比较多,具体的参数,下载地址我就不写了 平常也不怎么写文章,大部分都是代码,有不能运行的可以直接评论回复 有可能遇到的问题: json数据格式,这个要仔细 ...
- 一起学习《C#高级编程》2--比较对象的相等性
今后争取每两天能更新一次.平日的诱惑太多,双休只顾玩了,进度有点慢. 接上一讲的,类型的安全性,留下了点小尾巴——比较对象的相等性. C#有四种比较相等的方式:除了“==”运算符外,System.Ob ...
- ANE-如何加入ane,调试时又不报错
有时候我们加入ane,即使没有调用ane的功能,debug的时候也会报错无法调试,这是为什么呢?因为我们的ane没有把default包含进去. 首先我们的extension.xml要把default节 ...
- docker 存储驱动之 overlay2
overlay2 简介 OverlayFS是一种和AUFS很类似的文件系统,与AUFS相比,OverlayFS有以下特性: 1) 更简单地设计 2) 从3.18开始,就进入了Linux内核主线 3) ...
- StringBudiler源码简单解析
StringBudiler源码 继承关系树 底层实现 默认容量() 特别的添加方法(append) 1.继承关系树 继承自AbstractStringBuilder与StringBuffer同族 2. ...
- 九、基础正则表达式BRE
1.重要性:简单的说正则表达式就是处理一套字符串的规则和方法,以行为单位对字符串进行处理. 运维工作中,会有大量的访问日志,错误日志,大数据学习正则表达式是不可少的. 2.linux正则表达式,主要是 ...
- H - Birthday Paradox (生日悖论)
点击打开链接 Sometimes some mathematical results are hard to believe. One of the common problems is the bi ...
- 【ocp-12c】最新Oracle OCP-071考试题库(43题)
43.(9-2)choose three Which three tasks can be performed by DDL statements? A) preventing data retrie ...