【Python】Python学习笔记10

学习笔记:

'''
程序结构:
    1.一些简单的程序可以只用一个程序文件(.py文件)实现,但绝大多数的Python程序通常是由多个程序文件组成的。
    2.程序结构  指的是   将一个求解问题的程序分解为若干个源程序文件的集合   以及  将这些文件连接在一起的方法。
    3.Python程序通常由一个主程序以及多个模块组成。
        主程序:定义了程序的主控流程,是执行程序的启动文件,属于顶层文件。
        模块:指程序中的函数库,相当于子程序。
'''
import pytest

pytest.hello(pytest.name)
pytest.bey(pytest.name)
pytest.disp(6)
pytest.show(5)
'''
模块的有条件执行:
    一个程序文件(.py文件)可以作为一个模块,以磁盘文件的形式存在。
需求:
    模块中的定义部分(如定义变量、定义函数、定义类等),因为没有程序入口,所以不能直接运行;
    但对于模块的主程序部分有时候希望只让它在模块执行时才执行,被调用时不执行;在Python可以使用系统变量__name__的值来区分这两种情况。
__name__:是一个系统全局变量,在模块中用来标识模块名称。
    (1)模块中主动执行时是:字符串   "__main__"
    (2)模块被调用时是:模块的名称
应用:通过if判断来实现模块的主程序部分在模块执行时才执行,被调用时不执行。
    格式:
        if __name__ == "__main__":
'''
print(__name__)  # __main__      在本文件中显示__main__,当被调用时显示文件名。
if __name__ == '__main__':
    print("以下是文件执行时显示,调用时不显示的部分!")  # 以下是文件执行时显示,调用时不显示的部分!
'''
函数应用举例:
1.求y = e **2 + 1+lnN/2Pi的1-100的累加和;利用lambda函数求累加项,循环控制100次。
'''
from math import *

f = lambda n: (1 + log(n)) / (2 * pi)
y = exp(2.0)
for n in range(1, 101):
    y += f(n)
print('y=', y)  # y= 81.19547002494745
'''
2.先定义i ** m的1-n的累加和,然后调用求s = k 的1-100的累加和 + k ** 2 的1-50的累加和 + 1/k 的1-10的累加和。
'''


def mysum(n, m):
    s = 0
    for i in range(1, n + 1):
        s += i ** m
    return s


def fun2():
    s = mysum(100, 1) + mysum(50, 2) + mysum(10, -1)
    print(f's={s}')


fun2()
'''
3.设计一个程序,求满足以下两个要求的分数的个数:
    (1)1/6 < x < 1/5
    (2)x的分子、分母都是素数且分母是2位数。
分析:设x=m/n,根据条件(2)有10 <= n <=99;根据条件(1)有5m <= n <= 6m,并且m、n都为素数。
    用穷举法:设计一个函数判断一个数是否为素数,是则返回True,不是则返回False。
'''


def is_prime(n):  # 穷举法判断是否为素数
    found = True
    for j in range(2, int(sqrt(n) + 1)):  # sqrt(n):计算n的平方根
        if n % j == 0:  # 如果能被整除,则n不是素数,返回False。
            found = False
    return found


def fun3():
    count = 0  # 计数器
    for n in range(11, 100):
        if is_prime(n):  # 当函数is_prime()返回True时,才会继续执行下面程序。
            for m in range(n // 6 + 1, n // 5 + 1):  # // 整除符号; m取n//6+1到n//5+1范围内的所有整数。
                if is_prime(m):
                    print(f'{m}/{n}')
                    count += 1
    print(f'满足条件的个数为:{count}个')


fun3()
'''
4.汉诺塔问题:
    有三根柱子A、B、C,A上堆放了n个盘子,盘子大小不等,大的在下,小的在上;
    现要求把n个盘子从A借助B转移到C,每次只允许移动一个盘子。在移动的过程中在3个柱子上都保持大盘在下,小盘在上;
    打印出该步骤。
'''
cnt = 0


def hanoi(n, a, b, c):
    global cnt
    if n == 1:
        cnt += 1
        move(n, a, c)
    else:
        hanoi(n - 1, a, c, b)
        cnt += 1
        move(n, a, c)
        hanoi(n - 1, b, a, c)


def move(n, x, y):
    print(f'第{cnt}步:将{n}从{x}移动{y}')


def fun4():
    print('汉诺塔(Tower of Hanoi)\n'
          '从柱子A开始移动。\n'
          '请输入盘子个数:')
    n = eval(input())
    print(f'移动{n}个盘子的步骤如下:')
    hanoi(n, 'A', 'B', 'C')


fun4()

test.py内容:

import math

name = '小明'
age = 20


def greet():
    print(f'这是pytest.py中的greet函数,我的名字:{name},我的年龄:{age}')


'''
主程序入口检查或脚本入口检查:if __name__ == '__main__'
    作用:用于判断一个模块是否是作为主程序执行的。
        如果是,代码块中的内容将被执行;
        如果模块被导入到其他模块中,则这些代码块不会被执行。
    这个机制使得模块既可以作为独立的脚本执行,也可以被导入并作为其他程序的一部分使用,而不干扰到主程序的逻辑。
'''
if __name__ == '__main__':
    print('以下是pytest.py被调用时不可见的内容')
    def say_hello():
        print('hello')
    say_hello()


def fun1():
    print('这是pytest.py中的fun1函数')


def hello(person):
    print(f'hello,{person}')


def bey(person):
    print(f'bey,{person}')


def disp(r):
    print(math.pi * r * r)


def show(n):
    disp(n)

运行结果:

hello,小明
bey,小明
113.09733552923255
78.53981633974483
__main__
以下是文件执行时显示,调用时不显示的部分!
y= 81.19547002494745
s=47977.92896825397
2/11
3/17
5/29
7/37
7/41
11/59
11/61
13/67
13/71
13/73
17/89
17/97
19/97
满足条件的个数为:13个
汉诺塔(Tower of Hanoi)
从柱子A开始移动。
请输入盘子个数:
3
移动3个盘子的步骤如下:
第1步:将1从A移动C
第2步:将2从A移动B
第3步:将1从C移动B
第4步:将3从A移动C
第5步:将1从B移动A
第6步:将2从B移动C
第7步:将1从A移动C

Process finished with exit code 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值