代码来自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()