这一篇教程,我们来了解如何自定义函数。
在我们编程的过程中,往往要写一些进行某种运算的代码,通过这些代码获取我们想要的结果。
有时候,这些运算的代码,我们需要使用到多次,为了避免大量重复编写这些代码,我们可以把这些运算过程的代码定义为函数。
在第一篇教程中,我们见过下面这张图片,这张图片就是我们调用函数时要写入的内容。
那么,定义函数也必须包含这些内容。
另外,还要包含定义函数的关键字以及函数中运算过程的代码。
例如,我们定义一个获取身份证号中出生日期的函数。
示例代码:
def get_birthday(id): # 定义函数名称并设定参数 birthday = id[6:14] # 函数运算过程 print(birthday) # 函数运算过程 get_birthday('110123199001012121') # 调用函数,显示输出结果为:19900101 get_birthday('120122199508081321') # 调用函数,显示输出结果为:19950808
通过上方的代码,大家能够看到,定义函数时的一些关键内容:
1、要使用def这个关键字进行定义。
2、函数的名称建议使用小写单词组成,单词间以下划线分隔(下划线命名法),这样比较方便理解函数名称的含义。
3、参数是一个自定义的变量名称,通常也是使用小写的单词,用于提示输入的参数内容。
4、定义参数名称与参数以“:”结尾。
5、在定义函数名称与参数的下方,向右缩进编写运算代码的语句块。
6、通过函数名称并写入相应的参数即可调用函数,以实现相应的运算。
不过,上方我们定义的函数,并没有返回结果,而是直接在函数运算过程中进行了显示输出。
如果,我们需要获取到的出生日期,再进行使用,我们需要修改一下这个函数。
示例代码:
def get_birthday(id): # 定义函数名称并设定参数 birthday = id[6:14] # 函数运算过程 return birthday # 返回运算结果 b = get_birthday('110123199001012121') # 调用函数 print('您的出生日期是%s。' % b) # 显示输出结果为:您的出生日期是19900101
对比一下我们刚才的两段定义函数的代码,大家能够看到,第二段代码中我们通过return关键字,返回了运算结果(如果不加入return语句,则函数默认执行return None,即函数返回结果为None)。
这样,我们就可以在调用函数时,通过一个变量(例如上方代码中的b变量)接收到这个结果,进行使用。
注意:retrun语句会跳出结束函数,并返回结果,该语句之后的语句将不再被执行。
—————————————————————————-
上面我们定义的函数,只返回了一个结果。
如果,我们想把身份证号码中出生日期的年、月、日分别获取到呢?
接下来,我们再修改一下这个函数。
示例代码:
def get_birthday(id): # 定义函数名称并设定参数 year = id[6:10] # 函数运算过程 month = id[10:12] # 函数运算过程 day = id[12:14] # 函数运算过程 return year, month, day # 返回多个运算结果 y, m, d = get_birthday('110123199001012121') # 调用函数,将3个返回值存入3个变量 print('您的出生日期是%s年%s月%s日。' % (y, m, d)) # 显示输出结果为:您的出生日期是1990年01月01日。
通过上面的代码,大家可以看到,我们可以通过return关键字,返回多个运算结果。
实际上,函数返回的仍然是1个运算结果。
我们再来看下方这段代码。
示例代码:
def get_birthday(id): # 定义函数名称并设定参数 year = id[6:10] # 函数运算过程 month = id[10:12] day = id[12:14] return year, month, day birthday = get_birthday('110123199001012121') # 调用函数,返回结果存入变量 print(birthday) # 显示输出结果为:('1990', '01', '01') print('您的出生日期是%s年%s月%s日。' % birthday) # 显示输出结果为:您的出生日期是1990年01月01日。
通过上方代码,我们能够看到,我们可以通过1个变量接收函数的返回结果,这时我们得到的是1个包含了3个元素元组。
—————————————————————————-
在我们定义函数时,有些时候希望某些参数可以省略。
例如,我们通过身份证号码,获取出生日期或者年龄。
我们可以通过设定一个参数来控制函数如何返回结果。
示例代码:
def get_birthday(id, get_age=False): # 定义函数名称并设定参数,get_age为关键字参数,默认值为False if get_age: # 对参数进行判断 return 2017 - int(id[6:10]) # 返回计算公式的计算结果 else: year = id[6:10] # 函数运算过程 month = id[10:12] # 函数运算过程 day = id[12:14] # 函数运算过程 return year, month, day # 返回多个变量值 result = get_birthday('110123199001012121', True) # 调用函数,输入2个参数 print(result) # 显示输出结果为:27 result = get_birthday('110123199001012121') # 调用函数,省略第2个参数 print(result) # 显示输出结果为:('1990', '01', '01')
在上方这段代码中,我们新增了一个关键字参数,并为其设置默认值。
这样,我们在调用参数时,如果不填写第2个参数,一样可以执行函数。
此时,函数会读取第2个参数的默认值,参与运算过程。
如果,我们只定义参数而不写入默认值,即便函数运算过程中没有使用这个参数,程序也会抛出异常。
异常示例代码:
def get_birthday(id, get_age): # 定义函数名称与参数 birthday = id[6:14] # 函数运算过程 return birthday # 返回运算结果 result = get_birthday('110123199001012121') # 调用函数,此时会抛出异常
异常信息:
异常提示中TypeError是类型错误,提示内容为:get_birthday()函数丢失了1个必须位置的参数’get_age’。
所以,我们在定义函数时,设定的参数如果没有设置默认值,则调用函数时必须填入该参数。
那么,设置默认值的参数我们叫它关键字参数,没有默认值的参数是位置参数。
关键字参数对位置没有要求,不管是设定参数还是调用函数时,可以任意顺序写入。
而位置参数必须有着严格的位置和顺序,这样才能在调用函数时一一对应。
正是因为这个原因,当参数中同时包含位置参数和关键字参数时,位置参数要放在所有关键字参数的前面。
大家可以尝试将位置参数放在关键字参数的后方,运行程序会抛出异常提示。
SyntaxError: non-default argument follows default argument
语法错误:无默认值参数跟随默认值参数(即位置参数在关键字参数后方)
—————————————————————————-
另外,我们定义的函数,往往对输入的参数有类型的要求,当输入了错误的类型,会有异常发生。
例如,我们定义一个减法运算的函数,参数为两个整数。
示例代码:
def subtraction(num1, num2): # 定义函数并设定参数 result = num1 - num2 # 函数运算过程 return result # 返回运算结果 print(subtraction(3, 2)) # 调用函数,并显示输出结果:1。
上方代码中,我们调用函数时输入了两个整数,运行正常,得到了计算结果。
接下来,我们输入错误的参数,比如两个字符。
def subtraction(num1, num2): # 定义函数并设定参数 result = num1 - num2 # 函数运算过程 return result # 返回运算结果 print(subtraction('3', '2')) # 调用函数,程序抛出异常。
上方的代码运行之后,程序抛出异常。
TypeError:unsupported operand type(s) for -: ‘str’ and ‘str’。
提示内容为类型错误,不支持的操作数类型:’str’和’str’。
也就是说,字符串类型的参数不能进行减法运算。
这是系统给出的提示,我们也可以自定义这个异常的提示。
我们知道减法可以支持整数与小数,所以我们在函数中可以判断传入的参数值是否这两种类型。
如果不是,则给出异常提示。
示例代码:
def subtraction(num1, num2): # 定义函数并设定参数 if not isinstance(num1, (int, float)) \ or not isinstance(num2, (int, float)): # 判断参数是否指定类型, 代码过长时可以使用"\"换行 raise TypeError('参数类型错误,参数必须为整数或者小数。') # 设定自定义异常内容 result = num1 - num2 # 函数运算过程 return result # 返回运算结果 print(subtraction('3',2)) # 调用函数,程序抛出异常。
上方代码中,我们使用内置函数isinstance()对输入的参数值进行类型的比较,当任何一个参数不是int(整数)或者float(小数)类型时,都将抛出异常。
关键字raise用于引发异常,TypeError()为异常类型,括号中可以输入自定义的异常提示。
—————————————————————————-
最后,在我们编写代码时,我们还可以定义空函数。
空函数一般是在还没有确定函数内部代码如何编写,但是又需要不影响程序运行时使用。
我们只需要在函数内容写入pass关键字即可。
示例代码:
def subtraction(num1, num2): # 定义函数并设定参数 pass # 使用pass占位,保证程序运行正常 print(subtraction(1,2)) # 调用函数,返回结果为:None。
以上就是关于定义函数的内容。
关于字符串的相关操作就为大家介绍到这里,谢谢!
本节知识点:
1、定义函数;
2、设定函数返回结果;
3、设定函数返回多个结果;
4、设定参数与参数默认值;
5、参检查与自定义异常;
6、定义空函数。
本节英文单词与中文释义:
1、birthday:出生日期
2、year:年份
3、month:月份
4、day:日期
5、type:类型
6、error:错误
7、missing:丢失
8、required:必须
9、positional:位置
10、unsupported:不支持
11、operand:操作数
练习:
根据输入的手机号码返回运营商名称。
运营商号码列表:
mobile:[134, 135 , 136, 137, 138, 139, 147, 150, 151, 152, 157, 158, 159, 178, 182, 183, 184, 187, 188]
unicom:[130,131,132,145,155,156,171,175,176,185,186]
telecom:[133,149,153,173,177,180,181,189,199]
答案:(见评论1楼)
转载请注明:魔力Python » Python3萌新入门笔记(18)