第五章 函数和代码复用

5.1 函数的基本使用

5.1.1 函数的定义
def <函数名>(<参数列表>):
	<函数体>
	returen <返回值列表>
5.1.2 函数的使用
<函数名>(<实际赋值参数列表>)

5.2 函数的参数传递

5.2.1 可选参数传递
def <函数名>(<非可选参数列表>,<可选参数> = <默认值>):
	<函数体>
	return <返回值列表>
5.2.2 参数名称传递
<函数名>(<参数名> = <实际值>)
5.2.3 函数的返回值
变量1,变量2 = <函数名>(<实际值1>,<实际值2>)

5.3 变量的作用域

5.3.1 局部变量
# 变量z是函数multiply()内部使用的变量,当函数调用后,变量z将不存在。
def multiply(x, y=10):
    z = x * y  # z是函数内部的局部变量
    return z


s = multiply(99, 2)
print(f"打印s的值:{s}")
print(f"打印z的值:{z}")

# 运行结果
打印s的值:198
Traceback (most recent call last):
  File "局部变量.py", line 8, in <module>
    print(f"打印z的值:{z}")
NameError: name 'z' is not defined
5.3.2 全局变量
global <全局变量>
# 变量n是全局变量,在函数multiply()中使用时需要在函数内部使用global声明,定义后即可使用。
n = 2


def multiply(x, y=10):
    global n
    return x * y * n  # 使用全局变量n


s = multiply(99, 2)
print(f"打印s的值:{s}")

# 运行结果
打印s的值:396
# 如果未使用保留字global声明,即使名称相同,也不是全局变量
n = 2  # n是全局变量


def multiply(x, y=10):
    n = x * y
    return n  # 此处n不是全局变量


s = multiply(99, 2)
print(f"打印s的值:{s}")
print(f"打印n的值:{n}")  # 不改变外部全局变量的值

# 运行结果
打印s的值:198
打印n的值:2

5.4 代码复用

5.5 实例解析——软文的诗词风

txt = '''
人生得意须尽欢,莫使金樽空对月。
天生我材必有用,千金散尽还复来。
'''
linewidth = 30  # 预定的输出宽度


def lineSplit(line):
    plist = [',', '!', '?', ',', '。', '!', '?']
    for p in plist:
        line = line.replace(p, '\n')
    return line.split('\n')


def linePrint(line):
    global linewidth
    print(line.center(linewidth, chr(12288)))


newlines = lineSplit(txt)
for newline in newlines:
    linePrint(newline)
    
# 运行结果
                              
           人生得意须尽欢            
           莫使金樽空对月            
                              
           天生我材必有用            
           千金散尽还复来   

习题5

一、选择题
  1. 用来定义函数保留字的是:________

    A global B def C return D yield

    正确答案:B

  2. 以下关于Python函数的说法中正确的是:________

    A 可以用保留字作为函数的名字

    B 函数内部可以通过关键字global来声明全局变量

    C 调用带有默认值参数的函数时,不能为默认值参数传递任何值,必须使用默认值

    D 函数中没有return语句或者return语句不带任何返回值,那么该函数的返回值为True

    正确答案:B

  3. 程序最外层有一个变量a,定义一个函数,其中再次使用了变量a,以下说法正确的是:________

    A 函数中将a声明为global,对a的操作与全局变量无关

    B 函数中未将a声明为global,对a的操作与全局变量无关

    C 函数中未将a声明为global,对a的操作即为对全局变量a的操作

    D 函数中将a声明为global,对a的操作即为对全局变量a的操作,但函数返回时全局变量a被销毁

    正确答案:B

  4. 给出以下代码:

    def func(a=1):
        return a+1
    func(func(func()))的运行结果是:________
    

    A 1 B 2 C 3 D 4

  5. 给出以下代码:

    def func():
        print('Hello')
    type(func),type(func())的运行结果是:________
    

    A <class ‘function’>,<class ‘function’>

    B <class ‘function’>,<class ‘str’>

    C <class ‘function’>, <class ‘NoneType’>

    D <class ‘str’>,<class ‘function’>

    正确答案:C

  6. 以下说法错误的是:________

    A 函数定义不一定放在调用之前

    B 当代码中有main函数时,程序将从main开始执行

    C 可以在函数中定义函数

    D 语句 a = func()中,func函数可以没有返回值

    正确答案:B

  7. 给出以下代码:

    s = 'an apple a day'
    
    
    def split(s):
        return s.split('a')
    
    
    print(s.split())
    

    上述代码的运行结果是:________

    A [‘’, ‘n’, ‘pple’, ‘d’, ‘y’]

    B [‘an’, ‘apple’, ‘a’, ‘day’]

    C 在函数定义时报错

    D 在最后一行报错

    正确答案:B

  8. 定义函数如下:

    f = lambda x: x + 1
    f(f(1))代码的运行结果是:________
    

    A 1 B 2 C 3 D 会报错

    正确答案:C

  9. 以下说法中正确的是:________

    A 函数内部的语句不会改变任何非全局变量

    B 任何传入函数的参数都会以副本的形式存在于函数中

    C 在函数内定义的子函数只能在函数内调用

    D 每个函数必须有至少一个return语句

    正确答案:C

  10. 给出以下代码:

    def func(ls=[]):
        ls.append(1)
        return ls
    a=func()
    b=func()
    print(a,b)
    

    上述代码运行结果是:________

    A [1] [1] B [1] [1,1] C [1,1] [1] D [1,1] [1,1]

    正确答案:D

二、编程题
  1. 实现isNum()函数,参数为一个字符串,如果这个字符串属于整数、浮点数或复数的表示,则返回True,否则返回False。

    def isNum(a):
        try:
            complex(a) or int(a) or float(a)
            return True
        except ValueError:
            return False
    
    
    a = input("请输入一个字符串:")
    print(isNum(a))
    
  2. 实现isPrime()函数,参数为整数,要有异常处理。如果整数是质数,返回True,否则返回False。

    def isPrime(n):
        if n < 2:
            raise ValueError("整数必须大于等于2")
        for i in range(2, int(n ** 0.5) + 1):
            if n % i == 0:
                return False
        return True
    
    
    try:
        n = int(input("请输入一个整数:"))
        print(isPrime(n))
    except ValueError:
        print("输入错误!")
    
  3. 编写一个函数计算传入字符串中数字、字母、空格以及其他字符的个数。

    # 统计个数
    def num(s):
        letter_count = 0  # 英文字母个数
        digit_count = 0  # 数字个数
        space_count = 0  # 空格个数
        other_count = 0  # 其他字符个数
        for i in s:
            if i.isalpha():
                letter_count += 1
            elif i.isdigit():
                digit_count += 1
            elif i.isspace():
                space_count += 1
            else:
                other_count += 1
        return letter_count, digit_count, space_count, other_count
    
    
    s = input("请输入一行字符:")  # 输入一行字符
    
    # 输出结果
    for index, item in enumerate(num(s)):
        if index == 0:
            print(f"{index + 1}、英文字母个数:", item)
        elif index == 1:
            print(f"{index + 1}、数字个数为:", item)
        elif index == 1:
            print(f"{index + 1}、空格个数为:", item)
        else:
            print(f"{index + 1}、其他字符个数为:", item)
    
  4. 编写一个函数,打印200以内的所有素数,以空格分割。

    def print_prime_numbers():
        # 定义一个名为 print_prime_numbers 的函数
        prime_numbers = []  # 定义一个空列表,用于存储找到的质数
        for num in range(2, 201):  # 从2到200遍历所有数字
            for i in range(2, num):  # 对于每个数字,从2到该数字本身遍历所有数字
                if num % i == 0:  # 如果该数字可以被其它数字整除
                    break  # 退出循环
            else:  # 如果该数字不能被其它数字整除
                prime_numbers.append(num)  # 把该数字添加到质数列表中
    
        print(" ".join(str(num) for num in prime_numbers))  # 把质数列表中的所有数字转换为字符串,并以空格分隔后打印出来
    
    
    print_prime_numbers()
    
  5. 编写一个函数,参数为一个整数n。利用递归获取斐波那契数列中的第n个数并返回。

    def fibonacci(n):
        if n <= 1:
            return n
        else:
            return fibonacci(n - 1) + fibonacci(n - 2)
    
    
    n = int(input("请输入一个整数:"))
    print(fibonacci(n))
    
05-27 04:41