"""
Author: Seven_0507
Date: 2019-05-17
"""
8分4组有有多少种分法?
x 1 + x 2 + x 3 + x 4 = 8 x_1 + x_2 + x_3 + x_4 = 8 x1+x2+x3+x4=8
C M N = M ! N ! ( M − N ) ! , (M=8, N=4) C_M^N =\frac{M!}{N!(M-N)!}, \text{(M=8, N=4)} CMN=N!(M−N)!M!,(M=8, N=4)
"""
函数的定义和使用 - 计算组合数C(8,4)
> param : 非负整数n
> return: num的阶乘
"""
# 将求阶乘的功能封装成一个函数
def factorial(n):
result = 1
for num in range(1, n + 1):
result *= num
return result
# 当需要计算阶乘的时候不用再写循环求阶乘而是直接调用已经定义好的函数
print(factorial(8) // factorial(4) // factorial(4))
70
"""
函数的定义和使用 - 求最大公约数和最小公倍数
> param num: 非负整数x,y
> return: 最大公约数和最小公倍数
"""
# 最大公约数
def gcd(x, y):
if x > y:
(x, y) = (y, x)
for factor in range(x, 1, -1):
if x % factor == 0 and y % factor == 0:
return factor
return 1
# 最小公倍数
def lcm(x, y):
return x * y // gcd(x, y)
print(gcd(15, 27))
print(lcm(15, 27))
3
135
"""
写一个程序判断输入的正整数是不是回文素数
"""
def is_palindrome(num):
"""
(1) 函数的定义和使用 - 判断一个数是不是回文数
> param num: 非负整数num
> return: 布尔值
"""
temp = num
total = 0
while temp > 0:
total = total * 10 + temp % 10
temp //= 10
return total == num
def is_prime(num):
"""
(2) 函数的定义和使用 - 判断一个数是不是素数
> param num: 非负整数num
> return: 布尔值
"""
for factor in range(2, num):
if num % factor == 0:
return False
return True if num != 1 else False
if __name__ == '__main__':
num = int(input('请输入正整数: '))
if is_palindrome(num) and is_prime(num):
print('%d是回文素数' % num)
else:
print('%d不是回文素数' % num)
请输入正整数: 232
232不是回文素数
"""
Python的内置函数
- 数学相关: abs / divmod / pow / round / min / max / sum
- 序列相关: len / range / next / filter / map / sorted / slice / reversed
- 类型转换: chr / ord / str / bool / int / float / complex / bin / oct / hex
- 数据结构: dict / list / set / tuple
- 其他函数: all / any / id / input / open / print / type
Python调用模块中函数
"""
def myfilter(mystr):
return len(mystr) == 6
# help()
print(hex(ord('曹')))
print(abs(-1.2345))
print(round(-1.2345))
print(pow(1.2345, 5))
print('-'*30)
fruits = ['orange', 'peach', 'durian', 'watermelon']
print(fruits[slice(1, 3)]) # slice() 函数实现切片对象,主要用在切片操作函数里的参数传递。
# # filter()过滤掉不符合条件的元素,返回由符合条件元素组成新列表
fruits2 = list(filter(myfilter, fruits))
print(fruits)
print(fruits2)
0x66f9
1.2345
-1
2.8671833852463537
------------------------------
['peach', 'durian']
['orange', 'peach', 'durian', 'watermelon']
['orange', 'durian']
"""
函数的参数
- 位置参数=默认参数
- 可变参数
- 关键字参数
- 命名关键字参数
"""
# 参数默认值
def f1(a, b=5, c=10):
return a + b * 2 + c * 3
print(f1(1, 2, 3))
print(f1(100, 200))
print(f1(100))
print(f1(c=2, b=3, a=1)) # 传递参数时可以不按照设定的顺序进行传递
print('-'*30)
# 可变参数
# 在参数名前面的*表示args是一个可变参数
# 即在调用f2函数时可以传入0个或多个参数
def f2(*args):
sum = 0
for num in args:
sum += num
return sum
print(f2(1, 2, 3))
print(f2(1, 2, 3, 4, 5))
print(f2())
print('-'*30)
# 关键字参数
def f3(**kw):
if 'name' in kw:
print('欢迎你%s!' % kw['name'])
elif 'tel' in kw:
print('你的联系电话是: %s!' % kw['tel'])
else:
print('没找到你的个人信息!')
param = {
'name': '五月猴', 'age': 27}
f3(**param)
f3(name='五月猴', age=27, tel='13866778899')
f3(user='五月猴', age=27, tel='13866778899')
f3(user='五月猴', age=27, mobile='13866778899')
14
530
140
13
------------------------------
6
15
0
------------------------------
欢迎你五月猴!
欢迎你五月猴!
你的联系电话是: 13866778899!
没找到你的个人信息!
"""
作用域问题
"""
# (1) 局部作用域
def foo1():
a = 5
print(a)
foo1()
print('-'*30)
# (2) 全局作用域
b = 10
def foo2():
print(b)
foo2()
print('-'*30)
def foo3():
b = 100 # 局部变量
print(b)
foo3() # 局部变量值
print(b) # 全局变量值
print('-'*30)
def foo4():
global b # global关键字来指示foo4函数中的变量b来自于全局作用域
b = 200 # 全局变量
print(b)
foo4()
print(b)
5
------------------------------
10
------------------------------
100
10
------------------------------
200
200
"""
- 局部作用域
- 嵌套作用域
- 全局作用域
- 内置作用域
Python查找一个变量时会按照“局部作用域”、“嵌套作用域”、“全局作用域”和“内置作用域”的顺序进行搜索
"""
def foo():
b = 'hello' # b是定义在函数中的局部变量,属于局部作用域,在foo函数的外部并不能访问到它
def bar(): # Python中可以在函数内部再定义函数
c = True # c属于局部作用域,在bar函数之外是无法访问的
print(a)
print(b) # foo函数内部的bar函数来说,变量b属于嵌套作用域,可以访问
print(c)
bar()
# print(c) # NameError: name 'c' is not defined=无法访问
if __name__ == '__main__':
a = 100 # a是全局变量,属于全局作用域,因为它没有定义在任何一个函数中。
# print(b) # NameError: name 'b' is not defined #无法访问,只有在foo()函数中访问
foo()
特别注意:
在实际开发中,我们应该尽量减少对全局变量的使用,因为全局变量的作用域和影响过于广泛,可能会发生意料之外的修改和使用,除此之外全局变量比局部变量拥有更长的生命周期,可能导致对象占用的内存长时间无法被垃圾回收。事实上,减少对全局变量的使用,也是降低代码之间耦合度的一个重要举措
特别说明:
如果我们导入的模块除了定义函数之外还有可以执行代码,那么Python解释器在导入这个模块时就会执行这些代码,事实上我们可能并不希望如此,因此如果我们在模块中编写了执行代码,最好是将这些执行代码放入如下所示的条件中,这样的话除非直接运行该模块,if条件下的这些代码是不会执行的,因为只有直接执行的模块的名字才是“main”。
# 定义模块:module3.py
def foo():
pass
def bar():
pass
# __name__是Python中一个隐含的变量它代表了模块的名字
# 只有被Python解释器直接执行的模块的名字才是__main__
if __name__ == '__main__':
print('call foo()')
foo()
print('call bar()')
bar()
# 此时导入module3时 不会执行模块中if条件成立时的代码 因为模块的名字是module3而不是__main__
import module3
"""
Python常用模块
- 运行时服务相关模块: copy / pickle / sys / ...
- 数学相关模块: decimal / math / random / ...
- 字符串处理模块: codecs / re / ...
- 文件处理相关模块: shutil / gzip / ...
- 操作系统服务相关模块: datetime / os / time / logging / io / ...
- 进程和线程相关模块: multiprocessing / threading / queue
- 网络应用相关模块: ftplib / http / smtplib / urllib / ...
- Web编程相关模块: cgi / webbrowser
- 数据处理和编码模块: base64 / csv / html.parser / json / xml / ...
"""
import time
import shutil
import os
seconds = time.time()
print('seconds:',seconds)
print('-'*30)
localtime = time.localtime(seconds)
print(localtime)
print(localtime.tm_year)
print(localtime.tm_mon)
print(localtime.tm_mday)
print('-'*30)
asctime = time.asctime(localtime)
print(asctime)
strtime = time.strftime('%Y-%m-%d %H:%M:%S', localtime)
print(strtime)
mydate = time.strptime('2018-1-1', '%Y-%m-%d')
print(mydate)
print('-'*30)
shutil.copy('/Users/Hao/hello.py', '/Users/Hao/Desktop/first.py')
os.system('ls -l')
os.chdir('/Users/Hao')
os.system('ls -l')
os.mkdir('test')
seconds: 1558107755.2248743
------------------------------
time.struct_time(tm_year=2019, tm_mon=5, tm_mday=17, tm_hour=23, tm_min=42, tm_sec=35, tm_wday=4, tm_yday=137, tm_isdst=0)
2019
5
17
------------------------------
Fri May 17 23:42:35 2019
2019-05-17 23:42:35
time.struct_time(tm_year=2018, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=1, tm_isdst=-1)
------------------------------