引入
在写有些代码的时候,会发现有些步骤重复了多次,他也不像循环,都是相同的东西在重复,而是指做某件事情的步骤方法,做事的人或对象发生了改变,但是方法却没有改变。
要想写出高质量的代码,首先要解决的就是重复代码的问题。我们可以将某些解决问题的步骤,封装在一个称之为“函数”的功能模块中,当需要重复使用的时候,再调用这个“函数”就可以了。
定义函数
在Python中,使用关键字def
来定义函数,函数的名字的命名规则和变量名的命名规则是一样的。在函数名后面的圆括号中放置传递给函数的参数,可以理解成要对什么样的东西产生影响,类似数学上函数的自变量。在函数完成后可以通过return
关键字返回一个值。
请说出下面的方程有多少组正整数解。
实上,上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种方案。想到这一点问题的答案就呼之欲出了。
可以用Python的程序来计算出这个值,代码如下所示。
"""
函数
"""
def jc(n):
ans = 1
for i in range(1, n+1):
ans *= i
return ans
m = int(input('请输入m的值:'))
n = int(input('请输入n的值:'))
print(jc(m) // jc(n) // jc(m-n))
函数的参数
在Python中,函数的参数可以有默认值,也支持使用可变参数。
"""
函数参数
"""
def add(a=0,b=0,c=0):
return a+b+c;
print(add())
print(add(1))
print(add(1,2))
print(add(1,2,3))
print(add(c=50,a=100,b=200))
当我们在不确定参数个数的时候,我们可以使用可变参数。
"""
函数参数
"""
def add(*args):
total = 0
for var in args:
total += var
return total
print(add())
print(add(1))
print(add(1, 2))
print(add(1, 2, 3))
print(add(1, 3, 5, 7, 9))
使用模块管理函数
当出现同一个.py文件中定义了两个同名的函数,应为不存在重载的概念,后一个定义会覆盖之前的定义。
解决命名冲突,除了使用不同的命名外。我们也能使用模块来进行管理,这一点在多人协作开发时很有用。在Python中,每个文件就代表了一个模块,在使用函数的时候,我们通过impirt关键字导入执行的模块就可以区分到底要使用的是那个模块中的函数。
day0604.py
def foo():
print('hello,world!')
day0605.py
def foo():
print('goodbye,world!')
day0606.py
import day0604 as m1
import day0605 as m2
m1.foo()
m2.foo()
要说明的是,如果我们导入的模块除了定义函数之外还中有可以执行代码,那么Python解释器在导入这个模块时就会执行这些代码,事实上我们可能并不希望如此,因此如果我们在模块中编写了执行代码,最好是将这些执行代码放入如下所示的条件中,这样的话除非直接运行该模块,if条件下的这些代码是不会执行的,因为只有直接执行的模块的名字才是"__main_"
day0607.py
def foo():
pass
def bar():
pass
# __name__是Python中一个隐含的变量它代表了模块的名字
# 只有被Python解释器直接执行的模块的名字才是__main__
if __name__ == '__main__':
print('call foo()')
foo()
print('call bar()')
bar()
练习
练习一
实现计算求最大公约数和最小公倍数的函数
def gcd(x, y):
if y == 0:
return x
return gcd(y, x % y)
def lcm(x, y):
return x*y//gcd(x, y)
if __name__ == '__main__':
a = int(input('输入a:'))
b = int(input('输入b:'))
print('%d和%d的最大公约数:%d'%(a,b,gcd(a,b)))
print('%d和%d的最小公倍数:%d'%(a,b,lcm(a,b)))
练习二
判断一个数是不是回文数的函数
def reser(num):
_num=0
while num!=0:
_num=_num*10+num%10
num//=10
return _num
def isPalindrome(num):
_num=reser(num)
# print(_num)
return _num==num
if __name__ == '__main__':
x = int(input('请输入x:'))
if isPalindrome(x)==True:
print('是回文数')
else:
print('不是回文数')
练习三
实现判断一个数是不是素数的函数
def is_prime(num):
if num<2:
return False
for i in range(2,num//2):
if num%i==0:
return False
return True
if __name__ == '__main__':
x=int(input('请输入x:'))
if is_prime(x):
print('是质数')
else:
print('不是质数')
练习四
写一个程序判断输入的正整数是不是回文素数
import day0610 as m1
import day0609 as m2
if __name__ == '__main__':
x=int(input('请输入x:'))
if m1.is_prime(x) and m2.isPalindrome(x):
print('是回文质数')
else:
print('不是回文质数')