💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
> 相信大家学习过其他语言,懂得函数的作用。简单的说函数最好的作用就是可以使程序变得懒惰。python作为后起之秀,当然也会拥有函数这个有用的东西; ### 创建函数 使用def语句即可创建函数,如创建一个用来生成指定边界的斐波那契数列的函数: ~~~ #!/usr/bin/env python3 def fib(n):#使fibonacci数列到达n '打印fibonacci数列到n' a,b=0,1 while a<n: print(a,end=' ') a,b=b,a+b fib(20) 0 1 1 2 3 5 8 13 ~~~ 关键字 def 引入了一个函数 定义 。在其后必须跟有函数名和包括形式参数的圆括号。函数体语句从下一行开始,必须是缩进的。 ### 有关事项详解: ### 文档化函数 函数体的第一行语句可以是可选的字符串文本,这个字符串是函数的文档字符串,或者称为 docstring 。使用如下方式可以查看: ~~~ print(fib.__doc__) 打印fibonacci数列到n ~~~ ### 参数的传递 函数 调用 会为函数局部变量生成一个新的符号表。 确切的说,所有函数中的变量赋值都是将值存储在局部符号表。 变量引用首先在局部符号表中查找,然后是包含函数的 局部符号表,然后是全局符号表,最后是内置名字表。 因此,全局变量不能在函数中直接赋值(除非用 global 语句命名),尽管他们可以被引用。 函数引用的实际参数在函数调用时引入局部符号表,因此,实参总是 传值调用 (这里的 值 总是一个对象 引用 ,而不是该对象的值)。 1 一个函数被另一个函数调用时, 一个新的局部符号表在调用过程中被创建。 ### 函数名可以赋予其他名字 函数名可以重命名: ~~~ f=fib f(100) 0 1 1 2 3 5 8 13 21 34 55 89 ~~~ 可能有人误会说fib()函数没有返回值,千万注意这里使用的是函数名,没有使用函数调用;事实上fib()确实返回了一个空值,未加return语句返回的时None;可以使用下方法查看: ~~~ print(fib(10)) 0 1 1 2 3 5 8 None ~~~ ### 深入理解python3函数定义 在python中,你也可以定义包含若干参数的函数,这里有三种可用的形式,可以混合使用: ### 默认参数值: 默认参数的定义方法如下: ~~~ def f(a,b,x=3,y=5): '测试默认参数' print(a,b,x,y) ~~~ 上面的函数中参数a和b是必要参数,而参数x和y是可选参数,有自己的默认值; 这个函数可以通过几种不同的方式调用: 只给出必要参数: f(1,2) 给出一个可选的参数: f(1,2,4) 给出所有参数: f(1,2,4,6) 注意: 默认值只被赋值一次。这使得当默认值是可变对象时会有所不同,比如列表、字典或者大多数类的实例。例如,下面的函数在后续调用过程中会累积(前面) 传给它的参数: ~~~ def f(a, L=[]): L.append(a) return L print(f(1)) print(f(2)) print(f(3)) #输出 [1] [1, 2] [1, 2, 3] ~~~ 如果你不想让默认值在后续调用中累积,你可以像下面一样定义函数: ~~~ def f(a, L=None): if L is None: L = [] L.append(a) return L ~~~ ### 关键字参数: 有些时候函数的参数顺序是很难记忆的,为了让事情简单些,可以在调用时提供参数的名字: ~~~ def f(a,b,x=3,y=5): '测试关键字参数' print(a,b,x,y) #普通调用 f(1,2) #关键字调用 f(a=1,b=2,y=6) f(1,2,y=3) #输出 1 2 3 5 1 2 3 6 1 2 3 3 ~~~ 注意:当使用了关键字后必须一直使用不然会报错: 比如下: f(a=1,2) SyntaxError: non-keyword arg after keyword arg ### 可变参数列表: 可以让函数调用可变个数的参数,这些参数被包装进一个元组或者字典。 可变参数定义方式:只需在参数前面加上×号,参数被包装在元祖中 ~~~ def print_params(title,*params): print(title) print(params) ~~~ 可以和普通参数联合使用,×号收集的时其余的位置参数如: print_params(“peace”,23,170) 。如果不提供任何收集的元素,params时个空元祖:() 如: print_params(“pp”) 同样还可以处理关键字参数,定义如下:只需在关键字参数前面加上××号,被包装在字典中; ~~~ def print_params(title,**params): print(title) print(params) ~~~ 调用时必须注明关键字参数。可以这样调用: print_params(“peace”,age=23,high=170) print_params(“pp”) ### 参数列表的分拆 与可变参数刚好相反, 当你要传递的参数已经是一个列表,但要调用的函数却接受分开一个个的参数值。这时候你要把已有的列表拆开来 你可以在调用时加一个×操作符来自动把参数列表拆开:比如range(): ~~~ >>> list(range(1,10)) [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> args=[1,10] >>> list(range(*args)) [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> ~~~ 以同样的方式,可以使用 **操作符分拆关键字参数为字典: ### Lambda 形 式 出于实际需要,有几种通常在函数式编程语言例如 Lisp 中出现的功能加入到了 Python。通过 lambda 关键字,可以创建短小的匿名函数。这里有一个函数返回它的两个参数的和: lambda a, b: a+b 。 Lambda 形式可以用于任何需要的函数对象。出于语法限制,它们只能有一个单独的表达式。语义上讲,它们只是普通函数定义中的一个语法技巧。类似于嵌套函数定义,lambda 形式可以从外部作用域引用变量: ~~~ def fun(n): '下面x是参数,x+n是返回值' return lambda x: x+n #f接收lambda返回的函数 f=fun(10) print(f(0)) print(f(10)) #输出: 10 20 ~~~ #### 相关链接: [python3入门之类](http://rlovep.com/2015/09/23/python3%E5%85%A5%E9%97%A8%E4%B9%8B%E7%B1%BB/) [python3入门之函数](http://rlovep.com/2015/09/06/python3%E5%85%A5%E9%97%A8%E4%B9%8B%E5%87%BD%E6%95%B0/) [python3入门之循环](http://rlovep.com/2015/09/06/python3%E5%85%A5%E9%97%A8%E4%B9%8B%E5%BE%AA%E7%8E%AF/) [python3之if语句](http://rlovep.com/2015/08/05/python3%E4%B9%8Bif%E8%AF%AD%E5%8F%A5/) [python3入门之赋值语句介绍](http://rlovep.com/2015/08/03/python3%E5%85%A5%E9%97%A8%E4%B9%8B%E8%B5%8B%E5%80%BC%E8%AF%AD%E5%8F%A5%E4%BB%8B%E7%BB%8D/) [python3入门之print,import,input介绍](http://rlovep.com/2015/08/03/python3%E5%85%A5%E9%97%A8%E4%B9%8Bprint%EF%BC%8Cimport%EF%BC%8Cinput%E4%BB%8B%E7%BB%8D/) [python3入门之set](http://www.cnblogs.com/onepeace/p/4791578.html) [python3入门之字典](http://rlovep.com/2015/07/29/python3%E5%85%A5%E9%97%A8%E4%B9%8B%E5%AD%97%E5%85%B8/) [python3入门之字符串](http://rlovep.com/2015/07/28/python%E5%85%A5%E9%97%A8%E4%B9%8B%E5%AD%97%E7%AC%A6%E4%B8%B2/) [python3入门之列表和元组](http://rlovep.com/2015/07/14/python%E5%85%A5%E9%97%A8%E4%B9%8B%E5%88%97%E8%A1%A8%E5%92%8C%E5%85%83%E7%BB%84/) [python3入门之软件安装](http://rlovep.com/2015/07/14/python%E5%85%A5%E9%97%A8%E4%B9%8B%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85/) [python3爬虫之入门和正则表达式](http://rlovep.com/2015/09/23/python3%E7%88%AC%E8%99%AB%E4%B9%8B%E5%85%A5%E9%97%A8%E5%92%8C%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/)