自定义函数(下)*

  • 关于return和print()

上一节中,我们学习了用return来返回一个结果。初学时,可能搞不清return和print()到底该用哪一个。我们首先要理解返回一个值的意思:

上一节中,我们定义了my_abs函数:

def my_abs(x):
    if x >= 0:
        return x
    else:
        return -x

现在,我们定义另一个函数my_abs2:

def my_abs2(x):
    if x >= 0:
        print(x)
    else:
        print(-x)

我们将二者保存后运行:

>>> my_abs(-666)
666
>>> my_abs2(-666)
666

好像是一样的嘛?不过,我们再进一步:

>>> my_abs(-666) + 1
667
>>> my_abs2(-666) + 1
666
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in 
    my_abs2(-666) + 1
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

注意到,第二个函数,首先打印出了666,然后报了一个错。报错提示说:Python不支持一个叫做NoneType的东西和整数(int)进行运算。

在Python中,有一种特殊的数据类型称为NoneType,这类数据只有一个值None,它不支持任何运算,也没有任何方法可以调用。简单来说,这种数据类型就意味着啥也没有。

函数my_abs2()的定义中没有return命令,Python默认该函数返回的结果是None;None无法和整数1进行运算。

因此,我们要根据程序后期是否需要用到函数返回的结果等条件,来判断选择return还是print()。

 

  • 还是关于return和print()

我们对上述两个函数的定义修改如下:

def my_abs(x):
    if x >= 0:
        return x
    else:
        return -x
    print('没了')

def my_abs2(x):
    if x >= 0:
        print(x)
    else:
        print(-x)
    print('没了')

保存并执行:

>>> my_abs(-666)
666
>>> my_abs2(-666)
666
没了

在Python中,return语句在返回结果的同时,将退出函数。print()则没有这个功能。

 

  • 函数一定要传入参数嘛?

目前为止我们使用的函数都要求传入参数——函数名称后面的括号里都要填点什么。如果一个函数的法则,不需要作用于任何对象,那么这个函数可以不要参数。例如,我想讲一个生成1-100随机数的功能封装进一个函数random_num,我可以做如下定义:

>>> def random_num():
	import random
	return random.randrange(1, 101)

>>> random_num()
63
>>> random_num()
13

 

  • 文档字符串(docstring)

我们在交互界面输入help(),括号内填入任意的Python内建函数名称,会得到关于该函数的一般说明:

>>> help(len)
Help on built-in function len in module builtins:

len(obj, /)
    Return the number of items in a container.

Python的函数允许其作者在定义的第一行使用一个字符串,当该函数名称被help()调用时,显示这个字符串作为该函数的说明。比如,我们还是用我们的绝对值函数:

def my_abs(x):
    '返回参数x的绝对值'
    if x >= 0:
        return x
    else:
        return -x

保存并运行,然后我们利用help(my_abs)就可以查看到我们写的说明了:

>>> help(my_abs)
Help on function my_abs in module __main__:

my_abs(x)
    返回参数x的绝对值

这种开头写的字符串,我们给他起个名字叫文档字符串(docstring),这是个好习惯~ 可以让别人大致明白你这个函数是干嘛的。

 

  • 反复调用函数*

本章第8节我们改写过一个摄氏度与华氏度转换的程序:

try:
    temp_C = eval(input('请输入现在的摄氏温度:'))
    temp_F = temp_C * 1.8 + 32
    print('当前温度为华氏', temp_F, '度', sep = '')

except:
    print('请用阿拉伯数字输入温度')

你会发现,当用户运行这个模块时,如果用户真的输入了汉字,在得到错误提示后,程序就结束了。用户需要重新运行该模块才能更正输入。我们把这个模块用函数的方法改写一下:

def temp(): #这个函数不需要参数
    try:
        temp_C = eval(input('请输入现在的摄氏温度:'))
        temp_F = temp_C * 1.8 + 32
        print('当前温度为华氏', temp_F, '度', sep = '')

    except:
        print('请用阿拉伯数字输入温度')
        return temp() # 当用户输入错误,先打印提示信息,再重新运行这个函数

temp() #调用该函数

保存这个模块并运行:

=================== RESTART: C:\Users\MSI\Desktop\demo.py ===================
请输入现在的摄氏温度:一度
请用阿拉伯数字输入温度
请输入现在的摄氏温度:亮度
请用阿拉伯数字输入温度
请输入现在的摄氏温度:3
当前温度为华氏37.4度
>>> 

瞬间就更人性化了呢!

 

  • 本节练习

改写本章第八节中的练习题答案,使得用户任何时候输入错误都可以继续游戏。

=================== RESTART: C:/Users/MSI/Desktop/demo.py ===================
谜底是1-100间的整数,请输入您的答案...:二十
请输入纯阿拉伯数字啦...

谜底是1-100间的整数,请输入您的答案...:就不
请输入纯阿拉伯数字啦...

谜底是1-100间的整数,请输入您的答案...:咬我呀
请输入纯阿拉伯数字啦...

谜底是1-100间的整数,请输入您的答案...:55
您猜大啦

看答案

import random

answer = random.randrange(1, 101)

def guess_num():   
    '该函数用于猜数字游戏中对用户输入的数字与答案作比较,并给出相应提示'
    try:
        num = eval(input('谜底是1-100间的整数,请输入您的答案...:'))
    
    except:
        print('请输入纯阿拉伯数字啦...\n') #\n是换一行,方便用户看清
        return guess_num()

    while num != answer:
        if num > answer:
            print('您猜大啦\n')
            return guess_num()
        elif num < answer:
            print('您猜小啦\n')
            return guess_num()

    print('猜对啦!答案是:', answer, sep = '')

guess_num()

酱哦


 

如果还有什么问题或者发现了文章的错误,欢迎给我留言!邮箱可以随便乱写~

发表评论

邮箱地址不会被公开。 必填项已用*标注