最新消息:欢迎光临 魔力 • Python!大家可以点开导航菜单中的【学习目录】,这个目录类似图书目录,更加方便学习!

Python3萌新入门笔记(18)

Python教程 小楼一夜听春语 8311浏览 0评论

这一篇教程,我们来了解如何自定义函数。

在我们编程的过程中,往往要写一些进行某种运算的代码,通过这些代码获取我们想要的结果。

有时候,这些运算的代码,我们需要使用到多次,为了避免大量重复编写这些代码,我们可以把这些运算过程的代码定义为函数。

在第一篇教程中,我们见过下面这张图片,这张图片就是我们调用函数时要写入的内容。

那么,定义函数也必须包含这些内容。

另外,还要包含定义函数的关键字以及函数中运算过程的代码。

例如,我们定义一个获取身份证号中出生日期的函数。

示例代码:

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)

头像
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网站 (可选)

网友最新评论 (5)

  1. 小楼一夜听春语
    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]
    
    def get_perator_name(phone_number):
        n = int(phone_number[0:3])
        if n in mobile:
            return '中国移动'
        elif n in unicom:
            return '中国联通'
        elif n in telecom:
            return '中国电信'
        else:
            return '手机号码错误!'
    
    print(get_perator_name(input('请输入手机号码:')))
    
    小楼一夜听春语7年前 (2017-09-01)回复
    • 头像
      # 注意事项:以上列表中都是int类型,在判断之前,应该转换str为int类型后再做if in 的判断,否则会判断list中无str,出现手机号码错误 def GetPeratorName(number): n = int(number[0:3]) if n in mobile: return '中国移动' elif n in unicom: return '中国联通' elif n in telecom: return '中国电信' else: return '手机号码错误' print(GetPeratorName(input('请输入手机号码:')))
      老树发新芽5年前 (2020-01-05)回复
  2. 头像
    在python的函数里面有这种操作,需要两个参数但是你可以只给一个参数另外一个没有就使用默认值,这个要怎么实现? 其他语言好像没有这个功能
    zkarx7年前 (2018-03-21)回复
  3. 头像
    小楼老师原来是90年的!
    ML5年前 (2019-07-12)回复
  4. 头像
    def telephone(number): if int(number[0:3]) in ([134, 135 , 136, 137, 138, 139, 147, 150, 151, 152, 157, 158, 159, 178, 182, 183, 184, 187, 188]): print("mobile") elif int(number[0:3]) in ([130,131,132,145,155,156,171,175,176,185,186]): print("unicom") elif int(number[0:3]) in ([133,149,153,173,177,180,181,189,199]): print("telecom") else: print("not a phone number!") while(True): num=input("pls input your number(Q=quit):") if num=='q' or num=='Q': print('byebye') break elif len(num)!=11: print("it's not a phone number!") continue telephone(num)
    ywl5年前 (2019-11-19)回复