Python学习笔记(九)—— 函数
一、函数调用:
1、python内部函数查询:http://docs.python.org/3/library/functions.html#abs
2、注意调用函数的参数个数和类型。
3、函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量,相当于给这个函数起了一个“别名”:
- >>> a = abs # 变量a指向abs函数
- >>> a(-1) # 所以也可以通过a调用abs函数
- 1
二、定义函数
1、语法(以abs为例子)
- def my_abs(x):
- if x >= 0:
- return x
- else:
- return -x
(1)函数一定有返回值:为NONE
(2)在Python交互环境中定义函数时,注意Python会出现...
的提示。函数定义结束后需要按两次回车重新回到>>>
提示符下:
2、函数封装成文件
(1)第一步将函数写在一个python文件中
(2)使用命令:
- from python文件名(不要后缀) import 函数名字
(3)demo
3、空函数
(1)概念:
如果想定义一个什么事也不做的空函数,可以用pass
语句:
- def nop():
- pass
(2)作用:
比如现在还没想好怎么写函数的代码,就可以先放一个pass
,让代码能运行起来
4、参数检查
(1)个数检查
个数不对,python解释器会自动检查出来,幷报错。
(2)参数类型检查
类型出错,不会报出错误类型,需要自己手动添加。
- def my_abs(x):
- if not isinstance(x, (int, float)):
- raise TypeError('bad operand type')
- if x >= 0:
- return x
- else:
- return -x
其中isinstance是自带检测函数。
5、返回多个值
一个demo
- import math
- def move(x, y, step, angle=0):
- nx = x + step * math.cos(angle)
- ny = y - step * math.sin(angle)
- return nx, ny
(1)import math
语句表示导入math
包,并允许后续代码引用math
包里的sin
、cos
等函数
(2)然后,我们就可以同时获得返回值:
- >>> x, y = move(100, 100, 60, math.pi / 6)
- >>> print(x, y)
- 151.96152422706632 70.0
但其实这只是一种假象,Python函数返回的仍然是单一值:
- >>> r = move(100, 100, 60, math.pi / 6)
- >>> print(r)
- (151.96152422706632, 70.0)
原来返回值是一个tuple!但是,在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便。
三、函数的参数
1、位置参数
- def power(x):
- return x * x
其中的 x 便是位置参数。
2、默认参数
- def power(x, n=2):
- s = 1
- while n > 0:
- n = n - 1
- s = s * x
- return s
书写函数的时候可以将位置参数设置默认值,称为默认参数。
(1)好处:简化函数的调用方式,不需要修改参数n 的时候不需要赋值,简化函数的调用。
(2)规则:
A、必选参数在前,默认参数在后,否则Python的解释器会报错(思考一下为什么默认参数不能放在必选参数前面);
B、如何设置默认参数。当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。
(3)调用小结
- def enroll(name, gender, age=6, city='Beijing'):
- print('name:', name)
- print('gender:', gender)
- print('age:', age)
- print('city:', city)
有多个默认参数时,调用的时候,既可以按顺序提供默认参数,比如调用enroll('Bob', 'M', 7)
,意思是,除了name
,gender
这两个参数外,最后1个参数应用在参数age
上,city
参数由于没有提供,仍然使用默认值。
也可以不按顺序提供部分默认参数。当不按顺序提供部分默认参数时,需要把参数名写上。比如调用enroll('Adam', 'M', city='Tianjin')
,意思是,city
参数用传进去的值,其他默认参数继续使用默认值。
(4)默认参数必须指向不可变对象
一个Demo
- def add_end(L=[]):
- L.append('END')
- return L
- >>> add_end() #当你使用默认参数调用时,一开始结果也是对的:
- ['END']
>>> add_end() #但是,再次调用
add_end()
时,结果就不对了:['END', 'END']
>>> add_end()
['END', 'END', 'END']
默认参数L
的值一开始就被计算出来了,即[]
,因为默认参数L
也是一个变量,它指向对象[]
,每次调用该函数,如果改变了L
的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]
了。
修改方法:指向NONE
- def add_end(L=None):
- if L is None:
- L = []
- L.append('END')
- return L
3、可变参数
(1)格式
- def calc(*numbers):
- sum = 0
- for n in numbers:
- sum = sum + n * n
- return sum
即类似C语言指针的格式方法
(2)调用
A、list调用
- >>> nums = [1, 2, 3]
- >>> calc(*nums)
- 14
B、正常调用
- >>> calc(1, 2)
- 5
- >>> calc()
- 0
4、关键字参数
(1)定义:
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
(2)格式:
- def person(name, age, **kw):
- print('name:', name, 'age:', age, 'other:', kw)
(3)调用:
A、正常调用
- >>> person('Bob', 35, city='Beijing')
- name: Bob age: 35 other: {'city': 'Beijing'}
- >>> person('Adam', 45, gender='M', job='Engineer')
- name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
B、dict调用
- >>> extra = {'city': 'Beijing', 'job': 'Engineer'}
- >>> person('Jack', 24, **extra)
- name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
(4)命名关键字参数
对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部通过kw
检查。仍以person()
函数为例,我们希望检查是否有city
和job
参数:
- def person(name, age, **kw):
- if 'city' in kw:
- # 有city参数
- pass
- if 'job' in kw:
- # 有job参数
- pass
- print('name:', name, 'age:', age, 'other:', kw)
四、递归函数
1、尾递归
(1)概念
解决递归调用栈溢出的方法是通过尾递归优化,尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。
(2)但是:
python解释器没有实现这样的功能
Python学习笔记(九)—— 函数的更多相关文章
- python学习笔记(九)函数返回多个值,列表生成式,循环多个变量,入参格式声明
一.函数返回多个值 1.函数如果返回多个值的话,它会把这几个值放到一个元组里面2.函数如果返回多个值的话,也可以用多个变量来接收 def say(): num1 = num2 = num3 = ret ...
- python学习笔记(九)-函数2
交换两个变量的值 a = 2 b = 1 b = 1 a = 2 #方式一: b,a = a,b #交换两个变量的值 print(a,b) #方式二: a = a + b #3 b = a - b # ...
- Python学习笔记九
Python学习笔记之九 为什么要有操作系统 管理硬件,提供接口. 管理调度进程,并且将多个进程对硬件的竞争变得有序. 操作系统发展史 第一代计算机:真空管和穿孔卡片 没有操作系统,所有的程序设计直接 ...
- Python学习笔记之函数
这篇文章介绍有关 Python 函数中一些常被大家忽略的知识点,帮助大家更全面的掌握 Python 中函数的使用技巧 1.函数文档 给函数添加注释,可以在 def 语句后面添加独立字符串,这样的注释被 ...
- 小甲鱼:Python学习笔记003_函数
>>> # 函数>>> def myFirstFunction(params1,params2...): print("这是我的第一个函数!") ...
- Python学习笔记 - day6 - 函数
函数 函数在编程语言中就是完成特定功能的一个词句组(代码块),这组语句可以作为一个单位使用,并且给它取一个名字.可以通过函数名在程序的不同地方多次执行(这叫函数的调用).函数在编程语言中有基本分为:预 ...
- Python学习笔记系列——函数
今年下半年的计划主要是Python和Mysql了,公司不方便看书和视频,就照着廖雪峰的Python网站开始看了.以下纯为个人笔记记录,若是想系统学习的小伙伴还是看这里的好一些,毕竟系统.https:/ ...
- Python学习笔记_week3_函数
一.介绍 1.面向对象(华山派)--->类(独门秘籍)--->class(定义的关键字) 2.面向过程(少林派)--->过程--->def 3.函数式编程(逍遥派)---> ...
- Python学习笔记(五)函数和代码复用
函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Python提供了许多内建函数,比如print().同样,你也可以自己创建函数, ...
- python学习笔记(4)--函数
1.函数 函数是指将一组语句的集合通过一个名字封装起来.要想执行这个函数,只需调用其函数名即可. 函数的特性: 1.减少重复代码 2.使程序变的课扩展 3.使程序变得易维护 语法定义: def pri ...
随机推荐
- PHP文件操作[总结]
1.前言 工作中涉及到数据处理,后台需要用到PHP处理数据,之前没有接触过PHP,借此机会了解了一下PHP,PHP很方便,很灵活,编码很舒服,很喜欢用PHP处理后台数据.今天总结一下php文件操作,主 ...
- capwap学习笔记——初识capwap(二)
2.5.1 AC发现机制 WTP使用AC发现机制来得知哪些AC是可用的,决定最佳的AC来建立CAPWAP连接. WTP的发现过程是可选的.如果在WTP上静态配置了AC,那么WTP并不需要完成AC的发现 ...
- Android开发——Android M(6.0) 权限解决方案
Android开发--Android M(6.0) 权限解决方案 自从Android M(6.0)发布以来,权限管理相比以前有了很大的改变,很多程序员发现之前运行的好好的Android应用在Andro ...
- android中动态修改ImageView控件的宽高度
本例实现了动态修改ImageView控件的宽高度,有两个按钮,一个按钮实现放大image,一个按钮实现缩小image activity_main.xml <?xml version=" ...
- 当Ruby的model名字出错时,在现实view时显示错误的提示
app/controllers/courses_controller.rb:1:in `<top (required)>' app/controllers/courses_controll ...
- vsphere HA内幕变化
see aslo:http://www.yellow-bricks.com/vmware-high-availability-deepdiv/ HA Deepdive My posts on VMwa ...
- Linux中使用GoAccess进行日志实时监控
一.用法命令: goaccess access_log -o /var/www/html/report.html --real-time-html 说明:请先安装Httpd和Goaccess 二.效果 ...
- AT&T汇编和Intel汇编语法主要区别
AT&T使用$表示立即操作数,而Intel的立即操作数是不需要界定的.因此,使用AT&T语法引用十进制值4时,使用$4,使用Intel语法时只需使用4. AT&T在寄存器名 ...
- Mysql的union
我同事写了一条Sql语句,当时没看明白,下面晒出来: SELECT SUM(new_cart) AS ipv, AS iuv FROM tablename WHERE id = 5 ) as t OR ...
- V-rep学习笔记:Reflexxes Motion Library 3
路径规划 VS 轨迹规划 轨迹规划的目的是将输入的简单任务描述变为详细的运动轨迹描述.注意轨迹和路径的区别:Trajectory refers to a time history of positio ...