初识函数
本章内容:
1、为什么要用函数
2、创建和调用函数
3、函数的参数
收集参数
4、函数的返回值
5、函数文档
6、本章小结
7、作业
8、扩展阅读
++++++++++++++++++++++++++
1、为什么要用函数
现在python届发生了一个大事件,len方法突然不能直接用了。。。
然后现在有一个需求,让你计算'hello world'的长度,你怎么计算?
这个需求对于现在的你其实不难,我们一起来写一下。
s1 = "hello world" length = 0 for i in s1: length = length+1 print(length)
好了,功能实现了,非常完美。然后现在又有了一个需求,要计算另外一个字符串的长度,"hello eva".
于是,这个时候你的代码就变成了这样:
s1 = "hello world" length = 0 for i in s1: length = length+1 print(length) s2 = "hello eva" length = 0 for i in s2: length = length+1 print(length)
这样确实可以实现len方法的效果,但是总感觉不是那么完美?为什么呢?
首先,之前只要我们执行len方法就可以直接拿到一个字符串的长度了,现在为了实现相同的功能我们把相同的代码写了好多遍 —— 代码冗余
其次,之前我们只写两句话读起来也很简单,一看就知道这两句代码是在计算长度,但是刚刚的代码却不那么容易读懂 —— 可读性差
print(len(s1)) print(len(s2))
我们就想啊,要是我们能像使用len一样使用我们这一大段“计算长度”的代码就好了。这种感觉有点像给这段代码起了一个名字,等我们用到的时候直接喊名字就能执行这段代码似的。要是能这样,是不是很完美啊?
2、创建和调用函数
初识函数定义与调用
#使用def来创建,函数是以小写字母开头,类是大写字母开头, def myFirstFunction(): print("这是我的第一个函数!") print('我很激动') print('在这里感谢TBB,CCAV') """ 注意:在函数后面一定要加上一对小括号,括号是比不可少的,可以放参数 """ #调用函数 myFirstFunction() """ 函数的调用和运行机制:当函数myFirstFunction()发生调用操作,Python会自动找到 def myFirstFunction()的定义过程。 依次执行函数包含的所有代码块部分 """ #循环调用三次函数 for i in range(3): myFirstFunction()
3、函数的参数
参数
#括号里放的就是函数的参数 #参数使得函数可以个性化的实现 def mySecondFunction(name): print(name +'帅锅') mySecondFunction('小甲鱼') mySecondFunction('小鱿鱼') mySecondFunction('小丑鱼') #可以传多个参数,用逗号隔开 #python可以支持非常多的参数,一般最多10几个够 def add(num1,num2): print(num1 + num2) add(1,2)
形参和实参
#形式参数 parameter #实际参数argument #形参指的是函数创建和定义过程中小括号里的参数 #实参是指的函数被调用的过程中传递进来的参数 def myFunction(name): #形参 name print(name) myFunction('小甲鱼') #实参 '小甲鱼'
关键字参数和位置参数
#普通的参数叫位置参数 #关键字参数就是在传入实参时指定形参的变量名 def saySomething(name,words): print(name + '->' + words) saySomething('小甲鱼','让编程改变世界!') saySomething('让编程改变世界!','小甲鱼') #顺序和上面的不一样 saySomething(name='小甲鱼',words='让编程改变世界!') #使用了关键字参数 ''' 小甲鱼->让编程改变世界! 让编程改变世界!->小甲鱼 小甲鱼->让编程改变世界! '''
默认参数
#默认参数是在定义的时候赋予了默认值的参数 def saySomethiing(name='小甲鱼',words='让编程改变世界!'): print(name + '->' + words) #使用默认参数,在调用函数时可以不带参数 saySomethiing() """ 默认参数与关键字参数的区别: 1、关键字参数在调用时,通过参数名指定要赋值的参数,这样就不怕搞不清楚参数的顺序而导致函数调用出错; 2、默认参数是在参数定义的过程中,为形参赋初值,当函数调用的时候,不传递实参,则默认使用形参的初始值代替 """
收集参数
#收集参数 def test(*params): print('有%d个参数'%len(params)) print('第二个参数是:',params[1]) test('F','i','s','h','C') ''' 有5个参数 第二个参数是: i ''' test('小甲鱼',123,3.14) ''' 有3个参数 第二个参数是: 123 '''
#参数中带收集参数,其他的参数可以设置为默认参数 def test(*params,extra='8'): print('收集参数是:',params) print('位置参数是:',extra) test(1,2,3,4,5,6,7,8,9) ''' 收集参数是: (1, 2, 3, 4, 5, 6, 7, 8, 9) 位置参数是: 8 '''
打包与解包
#打包与解包 def test(*params): #打包 print('有%d个参数'% len(params)) print('第二个参数是:',params[1]) a = [1,2,3,4,5,6,7,8,9] #test(a) # 直接将列表名a作为实参将会出错 #IndexError: tuple index out of range test(*a) #实参前面加上星号(*)表示解包 ''' 有9个参数 第二个参数是: 2 ''' #python还有一种收集方式,就是用(**),将参数们打包成字典
4、函数的返回值
#函数中使用关键字return,后面跟着指定的返回值 def add(num1,num2): return num1 + num2 add(1,2)
再谈返回值
#返回多个值 def test(): return [1,'小甲鱼',3.14] print(test()) # [1, '小甲鱼', 3.14] #可以利用元组的形式返回多个值 def test(): return 1,'小甲鱼',3.14 print(test())
5、函数文档
def exchangRate(dollar): """ 美元 ->人民币 :param dollar: :return: """ return dollar * 6.5 a = exchangRate(10) print(a) #65 print(exchangRate.__doc__) #使用__doc__来获取函数文档 ''' 美元 ->人民币 :param dollar: :return: ''' help(exchangRate) #查看函数的帮助文档 ''' Help on function exchangRate in module __main__: exchangRate(dollar) 美元 ->人民币 :param dollar: :return: '''
6、本章小结
面向过程编程的问题:代码冗余、可读性差、可扩展性差(不易修改)
定义函数的规则:
1.定义:def 关键词开头,空格之后接函数名称和圆括号()。 2.参数:圆括号用来接收参数。若传入多个参数,参数之间用逗号分割。
参数可以定义多个,也可以不定义。
参数有很多种,如果涉及到多种参数的定义,应始终遵循位置参数、*args、默认参数、**kwargs顺序定义。
如上述定义过程中某参数类型缺省,其他参数依旧遵循上述排序 3.注释:函数的第一行语句应该添加注释。 4.函数体:函数内容以冒号起始,并且缩进。 5.返回值:return [表达式] 结束函数。不带表达式的return相当于返回 None def 函数名(参数1,参数2,*args,默认参数,**kwargs): """注释:函数功能和参数说明""" 函数体 …… return 返回值
调用函数的规则:
1.函数名() 函数名后面+圆括号就是函数的调用。 2.参数: 圆括号用来接收参数。 若传入多个参数: 应按先位置传值,再按关键字传值 具体的传入顺序应按照函数定义的参数情况而定 3.返回值 如果函数有返回值,还应该定义“变量”接收返回值 如果返回值有多个,也可以用多个变量来接收,变量数应和返回值数目一致 无返回值的情况: 函数名() 有返回值的情况: 变量 = 函数名() 多个变量接收多返回值: 变量1,变量2,... = 函数名()
参数总结:
8、扩展阅读
python之路——初识函数
参考:https://www.cnblogs.com/Eva-J/articles/7125925.html#_labelTop