Python100天之第6天:函数和模块的使用

代码来自github Python一百天

例题1:输入m,n求C(m,n)

"""
输入M和N计算C(M,N)

Version: 0.1
Author: zyb
"""
m = int(input('m = '))
n = int(input('n = '))
fm = 1
for i in range(1, m + 1):
    fm *= i
fn = 1
for i in range(1, n + 1):
    fn *= i
fm_n = 1
for i in range(1, m - n + 1):
    fm_n *= i
print(fm // fn // fm_n)

实现阶乘函数

def fac(num):
	"""求阶乘"""
	result = 1
	for n in range(num):
		result *= n
	return result

摇骰子,求和

from random import randint

def roll_dice(n=2):
	"""摇骰子"""
	total = 0
	for _ in range(n):
		total += randint(1, 6)
	return total
print(roll_dice()) # 默认值摇骰子
print(roll_dice(3)) # 摇三颗骰子

三个数相加

def add(a=0, b=0, c=0):
    """三个数相加"""
    return a + b + c
print(add()) # 默认值为0
print(add(1)) # a为1,其他值为默认值0
print(add(1, 2)) # a,b为1,2,其他值为默认值0
print(add(1, 2, 3)) # a,b,c为1, 2, 3,无默认值
print(add(c=50, b= 200 ,a=100)) # 传递参数时可以不按照设定的顺序进行传递

多个数相加

def add(*args):
	"""多个数相加"""
	total = 0
	for val in *args:
		total += val
	return total
	
# 在调用add()函数时可以传递0个或多个参数
print(add())
print(add(1, 2))
print(add(1, 2, 3))
print(add(1, 2 ,3, 4)) 

用模块管理函数

def foo():
	print('hello, world!')

def foo():
	print('goodbye, world!')
	
# 后面的定义会覆盖前面的定义
foo() # goodbye, world!

多个模块防止函数命名冲突

module1.py
def foo():
	print('hello, world!')
module2.py
def foo():
	print('goodbye, world!')
test.py
from module1 import foo

# 输出hello, world!
foo()

from module2 import foo

# 输出goodye, world!
foo()

也可按照如下所示的方式来区分使用哪一个函数:

test.py
import module1 as m1
import module2 as m2

m1.foo()
m2.foo()

如果是以下方式,则会发生覆盖:

test.py
from module1 import foo
from module2 import foo

# 输出goodbye, world!
foo()
from module2 import foo
from module1 import foo

# 输出hello, world!
foo()

需要说明的是,如果我们导入的模块除了定义函数之外还中有可以执行代码,那么Python解释器在导入这个模块时就会执行这些代码,事实上我们可能并不希望如此,因此如果我们在模块中编写了执行代码,最好是将这些执行代码放入如下所示的条件中,这样的话除非直接运行该模块,if条件下的这些代码是不会执行的,因为只有直接执行的模块的名字才是"main"。(引自github Python一百天

def foo():
	pass
	
def bar():
	pass

if __name__ == '__main__':
	print('call foo()')
	foo()
	print('call bar()')
	bar()
test.py
import module3
# 不会执行if条件句中的foo()和bar(),因为模块的名字是module3而不是__main__

练习1:实现计算求最大公约数和最小公倍数的函数

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 factor

def lcm(x, y):
	"""求最小公倍数"""
	return x * y // gcd(x, y)

练习2:实现一个数是不是回文数的函数

def is_palindrome(num):
	"""判断一个数是不是回文数"""
	temp = num
	total = 0
	while temp > 0: 
		total = total * 10 + temp % 10
		num //= 10
	return total == num

练习3:实现判断一个数是不是素数的函数

def is_prime(num):
	"""判断一个数是不是素数"""
	is_prime = False
	for n in range(2, int(num ** 0.5) + 1):
		if num % factor == 0 :
			return False
	return True if num != 1 else False

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

if __name__ = '__main__':
	num = int(input('请输入一个正整数:'))
	if is_palindrome(num) and is_prime(num):
		print('%d是回文素数' % num)

变量的作用域

def foo():
	b = 'hello'

	def bar():
		c = True
		print(a)
		print(b)
		print(c)
	
	bar()
	
if __name__ = '__main__':
	a = 100
	foo()

结果print 100,hello,True。
a为全局变量,a属于全局作用域;b为局部变量,属于局部作用域(对于c属于嵌套作用域);c为局部变量,属于局部作用域。

def foo():
	a = 200
	print(a) # 200
if __name__ == '__main__':
	a = 100
	foo()
	print(a) # 100	

结果为 200, 100。
在调用foo()后,a仍为100,因为a为全局变量,与局部变量的a不是同一个a。要想在局部作用域中修改全局变量,需要如下所示的代码:

def foo():
	global a
	a = 200
	print(a) # 200

if __name__ = '__main__'
	a = 100
	foo()
	print(a) # 200

github Python一百天的作者说,为了跨出理解函数和作用域的巨大一步,以后Python代码将按以下格式书写:

def main()
	# Todo: Add your code here
	pass

if __name__ == '__main__':
	main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值