文章目录
第五章 函数和代码复用
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
一、选择题
-
用来定义函数保留字的是:________
A global B def C return D yield
正确答案:B
-
以下关于Python函数的说法中正确的是:________
A 可以用保留字作为函数的名字
B 函数内部可以通过关键字global来声明全局变量
C 调用带有默认值参数的函数时,不能为默认值参数传递任何值,必须使用默认值
D 函数中没有return语句或者return语句不带任何返回值,那么该函数的返回值为True
正确答案:B
-
程序最外层有一个变量a,定义一个函数,其中再次使用了变量a,以下说法正确的是:________
A 函数中将a声明为global,对a的操作与全局变量无关
B 函数中未将a声明为global,对a的操作与全局变量无关
C 函数中未将a声明为global,对a的操作即为对全局变量a的操作
D 函数中将a声明为global,对a的操作即为对全局变量a的操作,但函数返回时全局变量a被销毁
正确答案:B
-
给出以下代码:
def func(a=1): return a+1 func(func(func()))的运行结果是:________
A 1 B 2 C 3 D 4
-
给出以下代码:
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
-
以下说法错误的是:________
A 函数定义不一定放在调用之前
B 当代码中有main函数时,程序将从main开始执行
C 可以在函数中定义函数
D 语句 a = func()中,func函数可以没有返回值
正确答案:B
-
给出以下代码:
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
-
定义函数如下:
f = lambda x: x + 1 f(f(1))代码的运行结果是:________
A 1 B 2 C 3 D 会报错
正确答案:C
-
以下说法中正确的是:________
A 函数内部的语句不会改变任何非全局变量
B 任何传入函数的参数都会以副本的形式存在于函数中
C 在函数内定义的子函数只能在函数内调用
D 每个函数必须有至少一个return语句
正确答案:C
-
给出以下代码:
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
二、编程题
-
实现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))
-
实现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("输入错误!")
-
编写一个函数计算传入字符串中数字、字母、空格以及其他字符的个数。
# 统计个数 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)
-
编写一个函数,打印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()
-
编写一个函数,参数为一个整数n。利用递归获取斐波那契数列中的第n个数并返回。
def fibonacci(n): if n <= 1: return n else: return fibonacci(n - 1) + fibonacci(n - 2) n = int(input("请输入一个整数:")) print(fibonacci(n))