老齐python-基础8(函数)
1、函数基本概念
2、理解函数
python中一个函数,就是一种映射关系
3、定义函数
#!/usr/bin/env python #coding:utf-8 def add_function(a,b): c = a+b return c if __name__ == "__main__": result = add_function(2,3) print(result)
def:是函数的开始,在声明要建立一个函数的时候,一定要使用def(define),意思就是告知python解析器,这里要声明一个函数。def所在的哪一行,包括后面的add_function(a,b)被称为函数头。
add_function:是函数名称。取名是有讲究的,在python中取名字的讲究就是要有一定的意义,能够从名字中看出这个函数是用来干什么的。
(a,b)是参数列表,要写在括号里面。这是一个变量(参数)列表,其中的变量(参数)指向函数的输入。
: 非常重要,如果少了,就会报错
c = a + b ,这一行开始就是函数体,函数体是缩进了4个空格的代码块,完成你需要完成的工作,
return c ,需要缩进4个空格,return是函数的关键字,意思是要返回一个值。return语句执行时,python跳出当前的函数并返回到调用这个函数的地方,在下面,有调用这个函数的地方 :result = add_function(2,3)但是,函数中的return语句也不是必须要写的,如果不写,python将认为以return None作为结束。也就是说,如果函数中没有return ,事实上在调用的时候,python也会返回一个结果None
if __name__ == "__main__":
result = add_function(2,3)
总结:
def 函数名(参数1,参数2,...参数n):
函数体(语句块)
4、标准
函数名的命名规则要符合python中的命名要求,一般用小写字母和单下划线、数字等组合。
def是定义函数的关键词,这个简写来自英文单词define
函数名后面是圆括号,括号里面可以有参数列表,也可以没有参数。
千万不要忘记括号后面的冒号
函数体(语句块),相对于def缩进,按照python习惯,缩进4个空格
多态:
>>> add("qiw","sir") Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'add' is not defined >>> def add(x,y): ... return x+y ... >>> add("qiw","sir") 'qiwsir' >>> add("qiwsir",4) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in add TypeError: Can't convert 'int' object to str implicitly
对象有类型,变量无类型
>>> add <function add at 0x7fabf4c30b70> >>> type(add) <class 'function'> >>> r = add >>> r <function add at 0x7fabf4c30b70> >>> r(3,4) 7 >>> add(3,4) 7 >>> type(r) <class 'function'>
5、命名总结
变量:变量名全部小写,由下划线连接各个单词,注意,变量的命名不要与Python保留的关键字冲突
文件名:全小写,可始用下划线
函数名:小写,可以始用下划线风格的单词,以增加可读性。
函数的参数:命名方式同变量(本质上就是变量)
6、函数调用
降低编程难度
代码重用
>>> add(10,3) x=10 y=3 13 >>> add(x=10,y=3) #指定函数变量值 x=10 y=3 13 >>> add(y=10,x=3) x=3 y=10 13 >>> def times(x,y=2): #创建函数内变量默认值 ... print("x={}".format(x)) ... print("y=",y) ... return x * y ... >>> times(2) x=2 y= 2 4 >>> times(3,4) #改变函数内变量默认值 x=3 y= 4 12 >>> def foo(): #函数嵌套,调用一个不存在的函数 ... print('Hello,Teacher Cang!') ... bar() ... >>> foo() Hello,Teacher Cang! Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in foo NameError: name 'bar' is not defined >>> def bar(): pass #定义函数体内函数,pass表示什么也不做 ... >>> foo() Hello,Teacher Cang!
7、函数返回值
斐波那契数列:
#!/usr/bin/env python3 # encoding: utf-8 """ @version: ?? @author: tajzhang @license: Apache Licence @file: fbnq.py @time: 2018/2/28 11:49 """ def fibs(n): result = [0,1] for i in range(n-2): result.append(result[-2] + result[-1]) return result if __name__ == "__main__": lst = fibs(10) print(lst)
返回多个值
>>> def my_fun(): ... return 1,2,3 ... >>> a = my_fun() >>> a (1, 2, 3) >>> type(a) <class 'tuple'> >>> x,y,z = my_fun() >>> print(x,y,z) 1 2 3
>>> def foo(): #定义空函数 ... pass ... >>> print(foo()) #返回空值 None >>> def my_fun(): #return中断函数体过程 ... print("I am coding.") ... return ... print("I finished.") ... >>> my_fun() I am coding.
定义函数中的帮助属性
#!/usr/bin/env python3 # encoding: utf-8 """ @version: 1.0 @author: tajzhang @license: Apache Licence @file: fbnq.py @time: 2018/2/28 11:49 """ def fibs(n): """ This is a Fibonacci sequence. #定义doc方法输出内容 """ result = [0,1] for i in range(n-2): result.append(result[-2] + result[-1]) return result if __name__ == "__main__": lst = fibs(10) print(lst) print(fibs.__doc__) #打印doc
>>> my_fun() I am coding. >>> def cang(): ... """This is a function of canglaoshi""" ... pass ... >>> cang.__doc__ 'This is a function of canglaoshi' >>> cang.breast = 90 #增加函数属性 >>> cang.breast 90 >>> cang.__name__ 'cang' >>> cang.__module__ '__main__'
传递多个参数
arg、args
>>> def func(x,*arg): #将其它参数组成元祖 ... print(x) ... result = x ... print(arg) ... for i in arg: ... result += i ... return result ... >>> func(1,2,3,4,5,6,7,8,9) 1 (2, 3, 4, 5, 6, 7, 8, 9) #arg或args 将多个参数揉进一个元祖 45
>>> def foo(x,*args): ... print("x:",x) ... print("tuple:",args) ... >>> foo(7) #定义函数给args传入空值 x: 7 tuple: ()