《零基础学Python》模块与函数【五】

整体文章目录

整体目录

一、 当前章节目录

在这里插入图片描述

二、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

五、习题

习题:

  1. import和from都可以用来引入模块,在什么情况下没法使用from?
  2. 使用from比使用import有哪些优点?又有哪些缺点?
  3. 下面的代码片段的输出结果是什么?
    s = lambda x, y : x + y
    print(s(‘aa’,’bb’))
  4. 写一个根据日期计算是星期几的模块,在程序中引入并使用这个模块。

答案:

  1. 在函数中无法使用from
  2. (1)优点:我们只在两种场合下建议使用这样的方法, 一个场合是:目标模块中的属性非常多, 反复键入模块名很不方便 , 例如 Tkinter (Python/Tk) 和 NumPy (Numeric Python) 模块 , 可能还有 socket 模块。另一个场合是在交互解释器下, 因为这样可以减少输入次数。
    (2)缺点:当我们使用from导入的时候,就会出现变量名的重复问题,因为我们把另外一个模块中所有的变量名都导入了进来,在命名的时候会出现命名冲突的情况。
  3. aabb
  4. 代码如下。
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值