python自学笔记(5)--python函数基础
来源:互联网 发布:mysql 数据库重命名 编辑:程序博客网 时间:2024/06/05 15:28
python自学笔记(5)--python函数基础
python中可以创建4种函数
全局函数:定义在模块中国
局部函数:嵌套于其他函数中
Lambda函数(匿名函数):表达式
方法(定义在类中的函数):于特定数据类型关联的函数,并且只能与数据类型关联一起使用。
一些相关的概念:
def是一个可执行语句,因此可以出现在任何能够使用语句的地方,甚至可以嵌套于其他语句,比如if或while中。
def创建了一个对象并且将其赋值给一个变量名(即函数名)
return用于返回结果,其为可选,无return则默认返回None对象。返回多个值时,彼此间使用分号分隔,且组合为元组形式返回一个对象。
def语句运行之后,可以在程序中通过函数后附加括号进行调用。
pass的作用:1. 空语句 do nothing2. 保证格式完整3. 保证语义完整。pass其实跟java中的注释TODO语句类似。
函数的作用域:
由内向外寻找变量声明,如果内部找到了就直接返回,没找到向外找,因此变量的作用域越小,优先级越高。首先是本地,接着是函数内,然后是全局变量,最后是内置变量。
python能够改变变量作用域的代码段是def、class、lamda。if/elif/else、try/except/finally、for/while 并不能涉及变量作用域的更改,也就是说他们的代码块中的变量,在外部也是可以访问的。
作用域问题可参见:http://python.jobbole.com/86465/
x = y = 43#全局变量def testFunc(): global x #x = 32#本地声明了x,因此可以生效 y = 23#此为本地变量,全局变量中的y在此处没有声明,修改无效,但是读取可以生效 print(x)#43 print(y)#打印的只是本地的y的值23testFunc()print(y)#全局的y的值没有被修改成功43*************************************************************************
z = 'global'def f1(): x = "from f1"; y = 3 print(x,z) def f2(): x = 'from f2'; print(x , y) f2()f1()#from f1 global#由内向外寻找变量声明,如果内部找到了就直接返回,没找到向外找,因此作用域越小,优先级越高#from f2 3
python的闭包:
闭包就是根据不同的配置信息得到不同的结果。
def outer(x): def inner(): print(x) return innerprint1 = outer(1)print2 = outer(2)print1()print2()每次函数outer被调用的时候,函数inner都会被重新定义。被函数记住的封闭作用域 – 能够被用来创建自定义的函数,本质上来说是一个硬编码的参数。事实上我们并不是传递参数1或者2给函数inner,我们实际上是创建了能够打印各种数字的各种自定义版本。
闭包单独拿出来就是一个非常强大的功能, 在某些方面,你也许会把它当做一个类似于面向对象的技术:outer像是给inner服务的构造器,x像一个私有变量。
具体参考网站:
https://www.cnblogs.com/ma6174/archive/2013/04/15/3022548.html
http://python.jobbole.com/81683/
P.S.当传入不可变对象的时候,在函数内部进行修改是不会改变原变量的值的,但是当传入是可变对象的时候,在函数内部进行修改是可以改变原变量的值的,比如int型传入是不会改变的,相当于函数内部重新创建了一个2,然后让函数内部的x指向了2,但是外部的m仍然指向3;而list是会改变的,list相当于浅复制了一个list传入函数,此时函数内部的l1指向的列表跟函数外部指向的列表是一个地址空间,所以pop之后会影响函数外部的列表结构。
不可变对象可以看成是值传递,可变对象可以看成是引用传递。
m = 3n = 4def f1(x, y): x -= 1 print(x, y)f1(m, n)#2 4print(m, n)#3 4l1 = [1, 2, 3, 4]def f2(x): x.pop() print(x)f2(l1)#[1, 2, 3]print(l1)#[1, 2, 3]
函数参数及其匹配模型
为了保证在函数内部没有修改外部的变量,可以传入形参为变量的副本,这样就不会改变函数外部的变量了。
l1 = [1, 2, 3, 4]def f1(x): x.pop() print(x)f1(l1[:]) # [1, 2, 3]f1(l1.copy()) # [1, 2, 3]print(l1) # [1, 2, 3, 4]
参数传递形式:位置参数:从左向右
关键字参数:按关键字名称匹配,混用上面两种方式时,位置参数必须写在关键字参数前面。
默认参数:在定义函数的时候就传一个默认值,未知的放左边,有默认值的放右面(后面)
可变参数:在定义函数时,使用星号*开头的参数,可用于收集任意多给予位置或关键字的参数。使用*为收集位置参数,使用**为收集关键字参数。
可变参数解包:调用函数时,使用*开头的参数,可用于将参数集合打散,从而传递任意多基于位置或关键字的参数。输入列表,输出元组。
python中函数参数传递的几种方法:https://www.cnblogs.com/or2-/archive/2014/02/01/3537104.html
匿名函数lambda运算符(是一个语句,不是函数)
lambda arg:expression#’:’后面是一个表达式,不能是一个语句,lambda
可以支持默认参数值,lambda运算符起到函数速写的作用。
f1 = lambda x, y: x + yprint(f1(2, 3)) # 5l3 = [lambda x: x * 2, lambda y: y * 3, lambda z: z * 4]for i in range(0, len(l3)): print(l3[i](i)) # 0,3,8;注意l3是列表,而l3[i]是函数类型
- python自学笔记(5)--python函数基础
- 【Python自学】08. 函数基础(上)
- Python自学笔记(四)函数
- Python自学笔记(五)Lambda函数
- 【笔记】Python 3自学笔记之函数
- python自学笔记(一)
- python自学笔记(一)
- python自学笔记--内嵌函数
- python自学笔记(7)--Python类
- Python基础自学-Python简介
- 【Python自学】02.Python基础
- python自学笔记(6)--Python函数式编程、函数的装饰器、递归
- 自学Python之Python基础:(三)Python代码结构
- 自学Python之Python基础:(四)Python多线程
- 自学Python之函数
- python自学笔记1
- python自学笔记 2
- python自学笔记 3
- 【Scikit-Learn 中文文档】三十五:无监督降维
- Hibernate的学习笔记
- MySQL外键约束删除时和更新时各取值的含义
- java 根据数据表实现增删改查代码自动生成
- 应用matlab多项式的表示以及运算
- python自学笔记(5)--python函数基础
- xcode真机调试包(持续更新,最新11.2)
- Android中传递对象的三种方法
- tomcat发布应用并配置域名
- springmvc配置Ehcache实现缓存管理
- myeclipse 无法正常添加server library
- vue结合vue-cli项目搭建
- 设计模式之策略模式(Strategy)
- Only a type can be imported. javax.persistence.Id resolves to a package