Python初级学习20230831

Python初级学习20230831

pycharm中有个双击shift就会弹出全局搜索框,实在太麻烦了,这里直接禁用。settings---->advanced settings---->user interface---->disable double modifier key shortcuts。

代码规范

在python命令中,输入import this,将会出现

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

分支结构

  1. python中if后不需要加括号,末尾添加冒号。缩进的话是以四个空格一层,至于制表符的话,个人还是觉得好用,不过规范的话肯定是打空格。

  2. 分支结构可以嵌套使用,但是一定要注意嵌套的深度,嵌套深度太深直接影响代码的可读性

  3. python中保持相同缩进的代码就属于同一个代码块

  4. 密码输入掩码,有个模块getpass,import getpass引入。使用getpass.getpass('密码:')。不过直接运行会有点问题,需要在pycharm中的terminal终端中运行。如果需要运行我的python程序,直接在后面编辑 python example02.py回车。

  5. 分段函数

    \[f(x)=\begin{cases} x-5,& x\gt5 \\ 2x+1, & 0 \le x \le 5 \\ 6x, & x \lt 0 \end{cases} \]

# 多分支结构 if
x = int(input('x的值:'))
if x > 5:
    y = x - 5
    print(f'x={x},y={y},条件为x>5')
elif x >= 0:  # 不要加条件x<=5,进入elif的时候就已经是<=5的情况了
    y = 2 * x  # 注意不要写成2x,会被认为是变量名,且还是错的
    print(f'x={x},y={y},条件为0<=x<=5')
else:
    y = 6 * x

    print('x的值%d,条件x<0,y的值%d' % (x, y))  # python中多个空行并不影响同层输出,不过一般也不会多空

编辑代码要注意可读性,扁平性,简单性。大道至简。

调试

在代码左边行号,可以添加断点。右键有debug是及调试模式,右上方爬虫也是调试模式。

循环

能够确定循环次数的一般使用for-in循环。

for-in循环

for i in range(1, 101, 2),是1<=i<101。第三个是步长,即i+=2。

x = int(input('x = '))  # 求个最大公约数
y = int(input('y = '))
for i in range(x, 0, -1):  # 从初始值,每次-1,直到x=1结束
    if x % i == 0 and y % i == 0:
        print(i)
        break
    else:
        pass  # 实际上一般用不上
# 这里不会进入循环,即首先设定i=2,然后判断i<2,结果false直接跳出循环
for i in range(2, 2):
    print('进来了')

while循环

# while循环
# 求x,y的最大公约数,欧几里得算法
while x % y != 0:  # 判断x是否能整除y
    x, y = y, x % y  # y = x % y求余数赋值,依旧拿的是之前x的数值
print(f'欧几里得算法求最大公约数为{y}')
while y % x != 0:
    x, y = y % x, x  # 不断进行y%x求余,而y则是上一次求余的x,x则是上一次求余的余数
print(f'欧几里得算法求最大公约数为{x}')

库的引用以及重命名

import math  # 引入math库
print(math.factorial(10))  # 使用阶乘
# ------------------------------------------
from math import factorial as fac  # 重命名,别名alias。从math库中导入factorial函数
print(fac(10))  # 求10的阶乘=10*9*8*...*1

获取时间

import time
start = time.time()
# 中间代码
end = time.time()
print(f'执行时间:{end - start:.3f}秒')

找到1-10000之间的完美数

import math
import time

start = time.time()
for i in range(2, 10001):  # (除自身外所有因子的和等于这个数)6=1+2+3
    total = 1 # 1都是因数
    for j in range(2, int(math.sqrt(i))+1):  # i**0.5也可以作为开方值
        if i % j == 0:
            total += j
            if i / j != j:
                total += i / j
    if i == total:
        print(i)
end = time.time()
print(f'代码运行时间{end - start:.2f}秒')

百钱买百鸡

# 百钱百鸡问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
# 设公鸡x,母鸡y,小鸡z
for x in range(0, 21):
    for y in range(0, 34):
        for z in range(0, 100, 3):  # 使用步长,直接就能确定z是3的倍数了
            if x + y + z == 100 and 5 * x + 3 * y + z / 3 == 100:
                print(f'可买公鸡{x}只,母鸡{y}只,小鸡{z}只')
                
                
for x in range(0, 21):
    for y in range(0, 34):
        z = 100 - x - y
        if z % 3 == 0 and x + y + z == 100 and 5 * x + 3 * y + z / 3 == 100:
            print(f'可买公鸡{x}只,母鸡{y}只,小鸡{z}只')

捕鱼问题

# 五个人(ABCDE)晚上去捕鱼,捕了不计其数的鱼,然后累了去睡觉。
第二天,A第一个醒过来,把鱼分成了5份,扔掉了多余的1条,然后拿走自己的1份;
B第二个醒过来,以为鱼没有分过,把剩下的鱼分成了5份,扔掉多余的1条,拿走自己的1份;
C、D、E依次醒过来,都按照同样的方法分鱼。问他们最少捕了多少条鱼?
import time
start = time.time()
fish_sum = 6
while True:
    temp = fish_sum
    is_result = True
    for _ in range(5):
        if (temp - 1) % 5 != 0:
            is_result = False
            break
        temp = (temp - 1) / 5 * 4
    if is_result:
        print(f'鱼的数量是{fish_sum}')
        break
    fish_sum += 5
end = time.time()
print(f'代码运行时间{end - start:.6f}秒')
# 下面这种是倒推的方式,容易写错
start2 = time.time()
e = 6  # E拿到的鱼的数量
while True:
    is_result = True
    fish_num = e * 5 + 1  # E当时的鱼总数
    for _ in range(4):  # 只需要回推四次就可以了
        if fish_num % 4 != 0:
            is_result = False
            break
        fish_num = fish_num / 4 * 5 + 1  # 鱼的总数回推,这个地方初始的时候没有/4导致死循环
    if is_result:
        print(f'鱼的数量是{fish_num}')
        break
    e += 1
end2 = time.time()
print(f'代码运行时间{end2 - start2:.6}秒')
posted @ 2023-09-01 08:12  Danlis  阅读(12)  评论(0编辑  收藏  举报