整体文章目录
一、 当前章节目录
二、Python程序的结构
- Python的程序由包、模块和函数组成。
- 模块是处理某一类问题的集合,模块由函数和类组成。
- 包是由一系列模块组成的集合。
三、模块
3.1 模块的创建
# myModule.py
# 自定义模块
def func():
print("MyModule.func()") # 定义func函数
class MyClass: # 定义MyClass类
def myFunc(self): # 定义myFunc方法
print("MyModule.MyClass.myFunc()") # 调用myFunc()方法
# call_myModule.py
# 调用自定义模块的类和函数
import myModule # 导入moudle
myModule.func()
myClass = myModule.MyClass()
myClass.myFunc()
运行结果:
MyModule.func()
MyModule.MyClass.myFunc()
3.2 模块的导入
# myModule.py
count = 1 # 定义全局变量count并赋值
def func(): # 定义func函数
global count
count = count + 1
return count
# call_myModule.py
import myModule
print("count = ", myModule.func())
myModule.count = 10
print("count = ", myModule.count)
import myModule
print("count = ", myModule.func())
# import置于条件语句中
if myModule.count > 1:
myModule.count = 1
else:
import myModule
print("count = ", myModule.count)
运行结果:
count = 2
count = 10
count = 11
count = 1
3.3 模块的属性
# myModule.py
if __name__ == '__main__':
print('myModule作为主程序运行')
else:
print('myModule被另一个模块调用')
运行结果:
myModule作为主程序运行
# call_myModule.py
import myModule
print(__doc__)
运行结果:
myModule被另一个模块调用
None
3.4 模块的内置函数
def func(x): # 定义func函数
if x > 0: # if判断
return x # 返回x的值
print(filter(func, range(-9, 10))) # 调用filter函数,返回的是filter对象
print(list(filter(func, range(-9, 10)))) # 将filter对象转换为列表
运行结果:
<filter object at 0x000001EA4B86D1C0>
[1, 2, 3, 4, 5, 6, 7, 8, 9]
def sum(x, y): # 定义sum函数
return x + y # 返回x + y的值
from functools import reduce # 引入reduce
print(reduce(sum, range(0, 10)))
print(reduce(sum,range(0, 10), 10))
print(reduce(sum, range(0, 0), 10))
运行结果:
45
55
10
def power(x): return x ** x # 定义power函数
print(map(power, range(1, 5))) # 打印map对象
print(list(map(power, range(1, 5)))) # 转换为列表输出
def power2(x, y): return x ** y
print(map(power2, range(1, 5), range(5, 1, -1))) # 打印map对象
print(list(map(power2, range(1, 5), range(5, 1, -1)))) # 转换为列表输出
运行结果:
<map object at 0x000001EA4B86D1C0>
[1, 4, 27, 256]
<map object at 0x000001EA4B86D310>
[1, 16, 27, 16]
3.5 自定义包
# pack\__init__.py
__all__ = ["myModule"]
if __name__ == '__main__': # 判断本模块是否作为主程序运行
print('作为主程序运行')
else:
print('pack初始化')
运行结果:
作为主程序运行
# parent\pack\myModule.py
def func(): # 定义func函数
print("pack.myModule.func()")
if __name__ == '__main__': # 判断本模块是否作为主程序运行
print('myModule作为主程序运行')
else:
print('myModule被另一个模块调用')
运行结果:
myModule作为主程序运行
# parent\pack2\__init__.py
__all__ = ["myModule2"]
if __name__ == '__main__': # 判断本模块是否作为主程序运行
print('作为主程序运行')
else:
print('pack2初始化')
运行结果:
作为主程序运行
# parent\pack2\myModule2.py
def func(): # 定义func函数
print("pack.myModule2.func()")
if __name__ == '__main__': # 判断本模块是否作为主程序运行
print('myModule2作为主程序运行')
else:
print('myModule2被另一个模块调用')
运行结果:
myModule2作为主程序运行
# parent\__init__.py
# from pack import myModule
# from pack2 import myModule2
from pack import *
from pack2 import *
myModule.func()
myModule2.func()
运行结果:
pack初始化
myModule被另一个模块调用
pack2初始化
myModule2被另一个模块调用
pack.myModule.func()
pack.myModule2.func()
四、函数
4.1 函数的定义
# 函数的定义
from __future__ import division # 导入division模块
def arithmetic(x, y, operator):
result = {
"+": x + y,
"-": x - y,
"*": x * y,
"/": x / y
}
return result.get(operator) # 调用get方法返回计算结果
# 函数的调用
print(arithmetic(1, 2, "+"))
运行结果:
3
4.2 函数的参数
# 函数的默认参数
def arithmetic(x=1, y=1, operator="+"): # 定义arithmetic函数
result = { # 定义result字典
"+": x + y,
"-": x - y,
"*": x * y,
"/": x / y
}
return result.get(operator) # 调用get方法返回计算结果
print(arithmetic(1, 2))
print(arithmetic(1, 2, "-"))
print(arithmetic(y=3, operator="-"))
print(arithmetic(x=4, operator="-"))
print(arithmetic(y=3, x=4, operator="-"))
运行结果:
3
-1
-2
3
1
# 列表作为参数传递
def arithmetic2(args=[],operator="+"):
x = args[0]
y = args[1]
result = {
"+": x + y,
"-": x - y,
"*": x * y,
"/": x / y
}
return result.get(operator)
print(arithmetic2([1, 2]))
运行结果:
3
def app(args=[]):
args.append(0)
print(args)
app()
app([1])
app()
运行结果:
[0]
[1, 0]
[0, 0]
def app1(args=[]):
if len(args) <= 0:
args = []
args.append(0)
print(args)
app1()
app1([1])
app1()
运行结果:
[0]
[1, 0]
[0]
# 传递可变参数
def func1(*args):
print(args)
func1(1, 2, 3)
运行结果:
(1, 2, 3)
# 传递可变参数
def search(*t, **d): # 定义search函数
keys = d.keys()
values = d.values()
print(keys)
print(values)
for arg in t:
for key in keys:
if arg == key:
print("find:", d[key])
search("one", "three", one="1", two="2", three="3") # 调用search函数
运行结果:
dict_keys([‘one’, ‘two’, ‘three’])
dict_values([‘1’, ‘2’, ‘3’])
find: 1
find: 3
4.3 函数的返回值
from __future__ import division # 导入division模块
def arithmetic(x, y, operator): # 定义arithmetic函数
result = {
"+": x + y,
"-": x - y,
"*": x * y,
"/": x / y
}
return result.get(operator) # 调用get返回计算结果
# 没有return语句的函数返回None
def func():
pass
print(func())
运行结果:
None
def func2():
return
print(func2())
运行结果:
None
# return返回多个值
def func3(x, y, z):
l =[x, y, z]
l.reverse()
numbers = tuple(l)
return numbers
x, y, z = func3(0, 1, 2)
print(x, y, z)
运行结果:
2 1 0
def func4(x, y, z): # 定义func函数
l = [x, y, z] # 定义l列表
l.reverse() # 调用reverse方法
a, b, c = tuple(l)
return a, b, c
x, y, z = func4(0, 1, 2)
print(x, y, z)
运行结果:
2 1 0
# 多个return语句
def func5(x): # 定义func5函数
if x > 0: # if判断
return "x > 0"
elif x == 0:
return "x == 0"
else:
return "x < 0"
print(func5(-2))
运行结果:
x < 0
# 多个return语句的重构
def func6(x):
if x > 0:
result = "x > 0"
elif x == 0:
result = "x == 0"
else:
result = "x < 0"
return result
print(func6(-2))
运行结果:
x < 0
4.4 函数的嵌套
# 嵌套函数
def sum(a, b):
return a + b
def sub(a, b):
return a - b
def func():
x = 1
y = 2
m = 3
n = 4
return sum(x, y) * sub(m, n)
print(func())
运行结果:
-3
# 嵌套函数
def func2():
x = 1
y = 2
m = 3
n = 4
def sum2(a, b):
return a + b
def sub2(a, b):
return a - b
return sum2(x, y) * sub2(m, n)
print(func2())
运行结果:
-3
# 嵌套函数,直接使用外层函数的变量
def func3():
x = 1
y = 2
m = 3
n = 4
def sum3(): # 内部函数
return x + y
def sub3():
return m - n
return sum3() * sub3()
print(func3())
运行结果:
-3
4.5 递归函数
# 计算阶乘
def refunc(n): # 定义refunc函数
i = 1
if n > 1: # 递归的结束判断
i = n
n = n * refunc(n - 1) # 递推
print("%d! = " %i, n)
return n # 回归
refunc(5)
运行结果:
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
# 使用reduce计算阶乘
from functools import reduce #Python3中reduce不再全局中,必须手动引入
print("5! = ", reduce(lambda x, y:x * y, range(1, 6)))
运行结果:
5! = 120
4.6 lambda函数
# lambda
def func():
x = 1
y = 2
m = 3
n = 4
sum = lambda x, y : x + y
print(sum)
sub = lambda m, n : m - n
print(sub)
return sum(x, y) * sub(m, n)
print(func())
运行结果:
<function func.. at 0x000001CD9F42EF70>
<function func.. at 0x000001CD9F44D040>
-3
# lambda的函数用法
print((lambda x: -x)(-2))
运行结果:
2
4.7 Generator函数
# 定义Generator函数
def func(n):
for i in range(n):
yield i
# 在for循环中输出
for i in func(3):
print(i)
# 使用next()输出
r = func(3)
print(r.__next__())
print(r.__next__())
print(r.__next__())
# print(r.__next__())
运行结果:
0
1
2
0
1
2
# yield与return区别
def func2(n):
for i in range(n):
return i
def func3(n):
for i in range(n):
yield i
print(func2(3))
f = func3(3)
print(f)
print(f.__next__())
print(f.__next__())
运行结果:
0
<generator object func3 at 0x000001C447C28900>
0
1
五、习题
习题:
- import和from都可以用来引入模块,在什么情况下没法使用from?
- 使用from比使用import有哪些优点?又有哪些缺点?
- 下面的代码片段的输出结果是什么?
s = lambda x, y : x + y
print(s(‘aa’,’bb’))- 写一个根据日期计算是星期几的模块,在程序中引入并使用这个模块。
答案:
- 在函数中无法使用from
- (1)优点:我们只在两种场合下建议使用这样的方法, 一个场合是:目标模块中的属性非常多, 反复键入模块名很不方便 , 例如 Tkinter (Python/Tk) 和 NumPy (Numeric Python) 模块 , 可能还有 socket 模块。另一个场合是在交互解释器下, 因为这样可以减少输入次数。
(2)缺点:当我们使用from导入的时候,就会出现变量名的重复问题,因为我们把另外一个模块中所有的变量名都导入了进来,在命名的时候会出现命名冲突的情况。- aabb
- 代码如下。
year = int(input("请输入年份:"))
month = int(input("请输入月份:"))
day = int(input("请输入日:"))
def yearsum(year):
if year < 2001:
return 0
year = year - 1
return yearday(year) + yearsum(year)
def yearday(year):
if (year % 4 == 0 and year % 100 != 0) or (year % 100 == 0 and year % 400 == 0):
return 366
else:
return 365
def monthsum(year, month):
if month < 2:
return 0
month = month - 1
if month == 1 or month == 3 or month == 5 or month == 7 or month == 8 or month == 10 or month == 12:
months = 31
elif month == 2:
months = 28 + yearday(year) - 365
else:
months = 30
return months + monthsum(year, month)
week = (yearsum(year) + monthsum(year, month) + day + 5) % 7
if week == 0:
week = 7
print(year, '年', month, '月', day, '日为:星期', week)
运行结果:
请输入年份:2021
请输入月份:6
请输入日:1
2021 年 6 月 1 日为:星期 2