> 文章列表 > Python从入门到精通第4天(函数和模块的使用)

Python从入门到精通第4天(函数和模块的使用)

Python从入门到精通第4天(函数和模块的使用)

函数和模块的使用

  • 函数的作用
  • 定义函数
  • 函数参数
  • 练习

函数的作用

编程大师Martin Fowler先生曾经说过:“代码有很多种坏味道,重复是最坏的一种!”,要写出高质量的代码首先要解决的就是重复代码的问题。对于上面的代码来说,我们可以将计算阶乘的功能封装到一个称之为“函数”的功能模块中,在需要计算阶乘的地方,我们只需要“调用”这个“函数”就可以了。

定义函数

在Python中可以使用def关键字来定义函数,和变量一样每个函数也有一个响亮的名字,而且命名规则跟变量的命名规则是一致的。在函数名后面的圆括号中可以放置传递给函数的参数,这一点和数学上的函数非常相似,程序中函数的参数就相当于是数学上说的函数的自变量,而函数执行完成后我们可以通过return关键字来返回一个值,这相当于数学上说的函数的因变量。

计算x1+x2+x3+x4=8x_1+x_2+x_3+x_4 = 8x1+x2+x3+x4=8的正整数有多少种解法,相当于求八个孩子分班级每个班至少一个孩子的分法有多少种。代码如下:

'''
函数结构为 def 函数名(参数):passreturn 0
'''m = int(input('请输入正整数m的值'))
n = int(input('请输入正整数n的值'))# 如果不知道自己输入的是哪一个
# 这里目的是如果输入的顺序出错了也能算出来
if m < n:m,n = n,mdef func(a):for i in range(1,a):a *= ireturn a# 函数的调用方式为【函数名+()】
# 因为函数的调用在栈上进行,所以系统会自动回收内存
print('结果为:',func(m)//(func(n)*func(m-n)))

Python的math模块中其实已经有一个名为factorial函数实现了阶乘运算,事实上求阶乘并不用自己定义函数。代码如下:

from math import factorialdef func(m,n):return factorial(m)//(factorial(n)*factorial(m-n))m = int(input('请输入m的值'))
n = int(input('请输入n的值'))if m < n:m,n = n,mprint('结果为:',func(m,n))

函数参数

函数是绝大多数编程语言中都支持的一个代码的"构建块",但是Python中的函数与其他语言中的函数还是有很多不太相同的地方,其中一个显著的区别就是Python对函数参数的处理。在Python中,函数的参数可以有默认值,也支持使用可变参数,所以Python并不需要像其他语言一样支持函数的重载,因为我们在定义一个函数的时候可以让它有多种不同的使用方式,下面是函数的几种情况:

无参数类型

# 无参数类型的函数
def func():print('无参数类型的')
func()

默认值参数

def func1(a=1,b=2):print('默认参数类型的',a,b)
# 此时我们看我们不传参数他输出的是什么呢
func1()

位置参数类型
在形式参数名字前加一个*号,该形式参数argstuple(元组)类型

def func2(*args):print('可变参数类型',args)# 在python中可变的数据类型有 列表,字典,集合
# 不可变数据类型有元组,字符串,数值
# 这里知道他是可变类型就行,后续会进行讲解
func2([129,2212])   # 输出为([129, 2212],) 他的输出是一个元组类型的

关键字参数
在形式参数名字前加**号,该形式参数kwargsdict类型

def func3(**kwargs):print('关键字参数',kwargs)func3()

练习

实现计算求最大公约数和最小公倍数的函数

def gcd(x, y):"""求最大公约数"""(x, y) = (y, x) if x > y else (x, y)for factor in range(x, 0, -1):if x % factor == 0 and y % factor == 0:return factordef lcm(x, y):"""求最小公倍数"""return x * y // gcd(x, y)

写一个程序判断输入的正整数是不是回文素数

def is_palindrome(num):"""判断一个数是不是回文数"""temp = numtotal = 0while temp > 0:total = total * 10 + temp % 10temp //= 10return total == numdef is_prime(num):"""判断一个数是不是素数"""for factor in range(2, int(num ** 0.5) + 1):if num % factor == 0:return Falsereturn True if num != 1 else Falseif __name__ == '__main__':num = int(input('请输入正整数: '))if is_palindrome(num) and is_prime(num):print('%d是回文素数'%num)