python笔记4 - 函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
定义一个函数
你可以定义一个由自己想要功能的函数,以下是简单的规则:
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
语法
def functionname( parameters ): #定义一个函数,functionname是函数名,函数名不能重复
"函数_文档字符串"
function_suite #函数体
return [expression] #return返回值,若无return,则该函数返回为None
参数
以下是调用函数时可使用的正式参数类型:
- 位置参数
- 默认参数
- 关键字参数
- 不定长参数(可变参数)
位置参数
位置参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样,位置参数为必填项。
调用plus函数,需要传入2个参数,否则报语法错误,如下:
def plus(x,y): #函数名plus,形参:x,y,简单来说就是函数接收的参数
print(x+y) #函数体,打印x+y的值
plus(3, 4) #函数调用,3和4就是实参,就是传入的参数,执行结果是:7
传入错误的参数个数,如下:
def plus(x,y):
print(x+y)
plus(3, 4, 5)
报错信息如下:
File "E:/python_workspace/base-code/day4/函数my.py", line 69, in <module>
plus(3, 4, 5)
TypeError: plus() takes 2 positional arguments but 3 were given
不按照正确的顺序传入参数,打印的结果如下:
def plus(name, age):
print(name, age)
plus(12, 'lhl') #name=12,age=lhl,明显输入不合法
位置参数 - 关键字传参
使用位置参数调用函数时,如果有多个位置参数的话,记不住哪个位置传哪个了怎么办,可以使用位置参数的名字来指定调用,如下:
#有多个位置参数,可能会越来越多,使用固定的位置参数时,记不住或者传错了位置,可以使用位置参数的名字来指定调用,叫关键字传参
def plus(name, age, sex, city, phone, money, color, time):
print(name, age, sex, city, phone, money, color, time)
plus('zhangsan',18, 'man', color='black', money=44444, time=time.time(),phone=13400000000,city='beijing')
执行结果显示与函数参数位置对应:
zhangsan 18 man beijing 13400000000 44444 black 1497020260.7982826
默认参数
调用函数时,默认参数的值如果没有传入,则被认为是默认值。这样就算你在调用的时候没传入这个参数,它也是有值的,默认参数不是必填项,如下:
def plus(name, sex, age=18): #age位默认参数,默认值是18
print(name, sex, age)
plus('zhangsan','man') #调用函数时,未输入age的值,则默认age值为18
执行结果:
zhangsan man 18
调用函数时,给默认参数传值,且默认参数在位置参数后面,如下:
def plus(name, sex, age=18): #age位默认参数,默认值是18,age必须位于位置参数后面
print(name, sex, age)
plus('zhangsan', 'man', age=28) #调用函数时,输入age的值,则默认age为输入的值
执行结果:
zhangsan man 28
调用函数时,默认参数位于 位置参数前面,则报语法错误,信息如下:
def plus(name, age=18, sex): #age位默认参数,默认值是18,age必须位于位置参数sex 前面,则语法错误
print(name, sex, age)
plus('zhangsan', 'man') #调用函数时,未输入age的值,则默认age的值
报错信息如下:
File "E:/python_workspace/base-code/day4/函数my.py", line 67
def plus(name, age=18, sex): #age位默认参数,默认值是18,age必须位于位置参数sex 前面,则语法错误 ^
SyntaxError: non-default argument follows default argument
非固定参数:
上面的两种位置参数和默认参数都是参数个数是固定的,如果说我一个函数,参数不是固定的,我也不知道以后这个函数会扩展成啥样,可能参数越来越多,这个时候如果再用固定的参数,那后面程序就不好扩展了,这时候就可以用非固定参数了,非固定参数有两种,一种是可变参数,一种是关键字参数。
可变参数:
可变参数用*来接收,后面想传多少个参数就传多少个,如果位置参数、默认值参数、可变参数一起使用的的话,可变参数必须在位置参数和默认值参数后面。可变参数也是非必传的。
def post(*args): #参数个数不固定时,使用*args可变参数,参数组,返回结果是元组,也为非必填参数
print(args) #打印结果是元组:('001', 'login', 'post'),该函数没有返回值,返回值为None
post() #调用函数,不传参数,打印结果为空的元组
print(post('', 'login', 'post')) 执行结果:
()
('', 'login', 'post')
None
可变参数与位置参数、默认参数一起使用,如下:
#可变参数使用*来接收,*可变参数名, 必须放在位置参数、默认参数后面,默认参数必须放在位置参数后面
def plus(name, sex, age=18, *args):
print(name)
print(sex)
print(age)
print(args)
plus('zhangsan', 'man', 'black', 44444, 13400000000, 'beijing') #默认参数可以不传 执行结果:
zhangsan
man
black
(44444, 13400000000, 'beijing')
关键字参数:
关键字参数使用**来接收,后面的参数也是不固定的,不限长度,也可以和位置参数、默认参数、可变参数一起使用,关键字参数必须在最后面。
使用关键字参数的话,调用的时候必须使用关键字传参。关键字参数也是非必传的。如下:
def other(**kwargs): #关键字参数,传入值通过key=value方式传入,返回结果是字典类型,也为非必填参数
print(kwargs)
other(name='byz', age=18) 执行结果:
{'name': 'byz', 'age': 18}
与位置参数、默认参数、可变参数一起使用,如下:
def other(name, age, sex='男', *args, **kwargs): #关键字参数,传入值通过key=value方式传入,返回结果是字典类型,也为非必填参数
print(name)
print(age)
print(sex)
print(args)
print(kwargs)
other('zhangsan', 24, 'red', 'sun', 110, city='beijing', score=99) 执行结果:
zhangsan
24
red
('sun', 110)
{'city': 'beijing', 'score': 99}
return 语句
return语句[表达式]退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。之前的例子都没有示范如何返回数值,下例便告诉你怎么做:
def sum(args1, args2):
total = args1 + args2
print('total :', total) #函数内打印出total的值
return total #函数返回total,若输入的args1、args2位int类型, 则该函数返回int;若输入的位int+float,则返回结果为float
print(sum(12, 13.1)) 执行结果:
total : 25.1
25.1
全局变量和局部变量
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。全局变量如果要在函数中修改的话,需要加global关键字声明,如果是list、字典和集合的话,则不需要加global关键字,直接就可以修改,如下:
name = 'marry' #字符串全局变量
names = [] #list全局变量
print(name)
print(names)
def test():
global name #修改全局变量-name的值就需要用global关键字声明下name为全部变量
name = 'Sriba' #修改全局变量name的值
names.append(name) #修改全局变量names的值
return names
test()
print('修改后', name)
print('修改后names', names) 执行结果:
marry
[]
修改后 Sriba
修改后names ['Sriba']
修改全局变量List类型的值,如下:
names = [1, 2, 3, 4] #list全局变量
print(names)
def test():
names = ['a', 'b', 'c', 'd'] #修改全局变量names的值不需要用global关键字声明, 直接进行修改
return names
print('修改后names:', test()) 执行结果:
[1, 2, 3, 4]
修改后names: ['a', 'b', 'c', 'd']
递归调用
递归函数:在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
递归函数的优点是:定义简单、逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,循环的逻辑不如递归清晰。
使用递归函数需要注意防止栈溢出。函数调用时通过栈(stack)这种数据结构实现,每当进入一个函数调用,栈就会加一层栈帧,每当函数烦死,栈就减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。
def login():
username = input('请输入用户名:').strip()
if username != '' :
if username == 'admin':
return username #登录成功则返回登录的用户名信息
else:
print('用户名不存在,请重新输入')
return login() #递归调用login函数,若登录成功,则返回输入的用户名
else:
print('用户名、密码不能为空')
栈溢出,可以尝试操作以下代码fct(10000):
def fct(n):
if n == 1:
return 1
else:
return n * fct(n-1)
高阶函数:
既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
简单举例:
def add(a, b, f):
return f(a) + f(b)
print(add(-5, 6, abs)) #此时f=abs(num)
python笔记4 - 函数的更多相关文章
- Python:笔记(2)——函数与模块
Python:笔记(2)——函数与模块 Python函数 关于函数 1.我们可以使用Help来查看函数的帮助信息 2.调用函数的时候,如果传入的参数数量或者类型不符合均会报错. 3.函数名其实就是一个 ...
- python笔记之函数
函数 >>> def funTest(param1): ... 'this is function document string.' #正文需要有缩进 ... return par ...
- python笔记22-literal_eval函数处理返回json中的单双引号
前言 在做接口测试的时候,最常见的接口返回数据就是json类型,json类型数据实际上就是字串,通常标准的json格式是可以转化成python里面的对应的数据类型的 有时候开发返回的数据比较坑,不按常 ...
- Python笔记008函数(2)
1. 昨日内容回顾: def 函数(): 函数体 return 值 如果不写return,默认返回None.可以单独返回一个值,也能够以元组的形式返回多个值.(不要把print和retu ...
- python笔记-字符串函数总结
字符串函数: chr() 数字转ASCII chr(96)="a" ord() ASCII转数字 ord("a")=96 isspace() 判断是否为空格 s ...
- Python笔记:调用函数,带扩号和和不带括号的区别
调用函数,如果带括号,那么是调用函数运行后的结果, 调用函数不带括号,调用的是函数本身 例如: def cun (a,b): return a+b print(cun) : 调用函数,打印的是函数 p ...
- Python笔记-built-in函数,文件操作,lambda函数
Built-In: i = abs(123) print(i) j = abs(-123) print(j)#123#123 #all,需要传一个可迭代的东西,里面所有的值是真,返回真 r1 = al ...
- 【python笔记】Qt+云函数 实现简单的登录框制作
[python笔记]Qt+云函数 实现简单的登录框制作 备注:前置条件:QtDesigner.pycharm.PyQt5.配置好的云函数(百度的叫函数计算CFC,用来充当一个简陋的服务器,主要是免费) ...
- Python学习笔记7-把函数当参数传递、指定可变参数
把函数当参数传递 # 函数参数传递 # 面向对象编程就是把对象传来传去 # 面向函数编程就是把函数传来传去 def mytest(num): return num * 2 # # 不光可以传递变量,还 ...
随机推荐
- JAVA简单选择排序算法原理及实现
简单选择排序:(选出最小值,放在第一位,然后第一位向后推移,如此循环)第一位与后面每一个逐个比较,每次都使最小的置顶,第一位向后推进(即刚选定的第一位是最小值,不再参与比较,比较次数减1) 复杂度: ...
- MyEclipse 集成 Gradle开发环境
一.上Grandle官网下载Gradle,地址:http://www.gradle.org/downloads 如果只是运行只下载gradle-2.6-bin.zip 就可以了,如果为了扩展开发的话就 ...
- linux内核及其模块的查询,加载,卸载 lsusb等
http://blog.sina.com.cn/s/blog_53e81e2a0100zkxi.html 1,/sbin/update-modules文件,他是一个linux通用的模块管理脚本程序. ...
- LightOj 1221 - Travel Company(spfa判负环)
1221 - Travel Company PDF (English) Statistics problem=1221" style="color:rgb(79,107,114)& ...
- input输入框禁止显示历史记录
有时我们在设计网页时不想让表单保存用户输入历史记录,比如一些隐私数据 <input name="test" type="text" id="te ...
- SQL数据库有阻塞就自动发邮件警报
1.建查询是否有阻塞的视图 create view [dbo].[VW_WaitingCount] as SELECT s.session_id, r.blocking_session_id, s.h ...
- RSA/DSA 密钥的工作原理
下面从整体上粗略的介绍了 RSA/DSA 密钥的工作原理.让我们从一种假想的情形开始,假定我们想用 RSA 认证允许一台本地的 Linux 工作站(称作 localbox)打开 remotebox 上 ...
- Unity 逻辑层通知UI 通过接口消除他们通信的switch判断
需求如何: 用户名字长度为2-12之间, 如果错误在界面上弹出一个消息框 写烂一点 public void PostRename(string name) { if (string.IsNullO ...
- Ubuntu 如何切换到root账户
root账号问题 ubuntu默认禁用了root账号,所以当年试图使用su root命令切换到root用户时,尽管你已经输入了正确的密码,终端依旧会提示你密码错误.你需要执行以下命令解除root账号的 ...
- cascade=CascadeType.ALL的深坑
cascadetype是 级联的配置 all标示所有都级联操作 默认级联查询都是开启的 all标示 删除和update都级联操作 现在是 save的时候 他会级联保存一条数据 但是由于原有id已 ...