学习总结四
函数定义
- 函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段
- 函数能提高应用的模块性,和代码的重复利用率
定义函数
- 以 def 关键词开头,后接函数标识符名称和圆括号 ()
- 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数
- 函数内容以冒号起始,并且缩进
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None
实例
计算C(m, n)
def f(x):
# def 定义函数语法;f() 函数名;x 参数(自变量)
y = 1
for num in range(1, x + 1):
y *= num
return y
# 引入定义函数,前后最好空两行
m = int(input('m = '))
n = int(input('n = '))
# 当需要计算阶乘的时不用再写循环,而是直接调用已经定义好的函数
print(f(m) // f(n) // f(m - n))
函数调用
1.定义函数:给出函数一个名称,指定函数里包含的参数,以及代码块结构
2.完成函数的基本结构,可以通过另一个函数调用执行函数,也可以直接从 Python 命令提示符中调用执行
练习
练习1
判断是否是素数
def f(x):
for y in range(2, x):
if x % y == 0:
return False
elif:
return True
m = int(input('m = '))
print(f(m))
练习2
可变参数——表示函数参数个数不确定,可以任取参数个数
def add(*args):
total = 0
for value in args:
total += value
return total
print(add(1, 2))
print(add(1, 2, 3))
练习3
判断是否是回文数
def is_palindrome(num):
"""
判断一个数是否是回文数
:param num:一个非负整数
:return:是回文数返回True,否则False
"""
temp = num
total = 0
while temp > 0:
total = total * 10 + temp % 10
temp //= 10
return num == total
print(is_palindrome(12321))
练习4
判断字符串是否是回文
def is_palindrome(s):
lens = len(s)
if lens <= 1:
return True
l, r = 0, lens - 1
while l < r:
l += 1
r -= 1
if s[l] != s[r]:
return False
return True
if __name__ == '__main__':
s = input('输入字符串:')
print(is_palindrome(s))
练习5
拿火柴小游戏(21根火柴,谁拿最后一根谁输(保证电脑获胜))
from random import randint
def main():
match = 21
while match >= 0:
while True:
a = int(input('你拿的火柴根数:'))
if 1 <= a <= 4 and a <= match:
break
match -= a
b = 5 - a
print('电脑拿的火柴根数:%d' % b)
match -= b
print('剩余火柴总根数:%d' % match)
if match <= 1:
print('你拿到最后一根!')
break
print('电脑获胜!')
if __name__ == '__main__':
main()
变量作用域
1.程序的变量并不是在任何位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。变量的作用域决定了在哪一部分程序可以访问哪个特定的变量
2.python搜索一个变量的方法是从局部作用域到嵌套作用域再到全局作用域(Local - Enclosed - Global(LEG))
3.如果想改变搜索范围,可以使用global和nonlocal关键字
4.在实际开发中,一定要减少对全局变量的使用
实例
a = 100
def foo():
# 函数内的a是局部变量(local variable),离开foo函数变量a是无法访问的
#global a
# global 表示将函数内的变量定义为全局变量
a = 200
print(a)
foo()
print(a)
递归函数
- 收敛条件:让递归在有限的次数内完成或者回溯(否则:recursion error)
- 递归公式
练习6
用递归求阶乘
def f(n):
if n == 0 or n == 1:
return 1
return n * f(n - 1)
if __name__ == '__main__':
print(f(5))
练习7
用递归函数求最大公约数(短除法)
def gcd(x, y):
if x > y:
return gcd(y, x)
elif y % x == 0:
return x
else:
return gcd(y % x, x)
print(gcd(222, 222))
练习8
求10级楼梯有多少种走法
def walk(n):
if n < 0:
return 0
elif n == 0:
return 1
else:
return walk(n - 1) + walk(n - 2) + walk(n - 3)
if __name__ == '__main__':
print(walk(10))
练习9
生成指定长度的验证码
from random import randint
def generate_code(code_len=4):
all_chars = '0123456789abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQUVWXYZ'
code = ''
for _ in range(code_len):
index = randint(0, len(all_chars) - 1)
code += all_chars[index]
return code
if __name__ == '__main__':
for _ in range(5):
print(generate_code(code_len=4))
练习10
获取文件后缀名
def get_suffix(filename):
pos = filename.rfind('.')
if 0 < pos < len(filename) - 1:
return filename[pos + 1:]
else:
return ''
if __name__ == '__main__':
print(get_suffix('abc.abc'))