今天猛猪突进一般的学了三节课,一节课大约10分钟左右,然后写作业写到天昏地暗。

上课一分钟,作业十年功。大概是这个意思。而且今天学习的知识都是各种逻辑圆环套圆环,代码量也是学习以来最多的一天。

不过打代码的好处就是反馈比较快,做成了就是做成了,跑不动就是跑不动。相比产品、运营这种玩长线投资,最简单的活动从策划到上线到复盘没有半个月你想都不要想的苦大仇深工种。还是好一些的。

废话不多说,回顾一下今天的课程吧。

第一节课:
学习分支语句里的“elif”以及“else”语法。其实分支语法里面一共有三个语法,if、elif、else。if是假如后面的条件成立,则执行代码模块,elif的意思是一旦后面的条件成立,将中断判断。else就是当以上if或者elif的条件都不成立时,将执行后续模块。

#举例说明
IQ = 100
if IQ > 120:print("我是天才!")
elif IQ < 60:print("我怕不是个弱智?")
elif IQ < 80:print("我疑似是个正常人?")
else:print("我就是个路人甲啊!")

当IQ小于60的时候,即第一个elif语句成立后,后续的判断将不再进行,直接中断。而如果IQ是100,即不再上述if及elif语句中,则触发else。

第二节课:

条件表达式,简单来说就是将分支的模块变成一条语句,看着简洁一些。

#原模块
IQ = 100
if IQ > 120:
    print("我是天才!")
elif IQ < 60:
    print("我怕不是个弱智?")
elif IQ < 80:
    print("我疑似是个正常人?")
else:
    print("我就是个路人甲啊!")
#改成条件表达式后
IQ = 100
IQ = "我是天才!" if IQ > 120 else "我怕不是个弱智?" if IQ < 60 else "我疑似是个正常人?" if IQ < 80 else "我就是个路人甲啊!"
print(IQ)

其实讲道理,我还是觉得用传统的语法比较清晰……这种看着太累了。当然,如果是简单的语句,这样写确实也比较简单啦(但是想骗代码量就不行了)。

还有一个分支结构嵌套,简单来说就是分支里面套分支。这个是真的挺麻烦的,非常吃逻辑。像我这种,就被一个逻辑反复吊打,真是难受。

这次的作业题目非常可怕,在评论区我看到了无数人的哀嚎。我最后是通过了,不过是用一些奇淫巧技通过的。

题目很简单:做一个模拟抛硬币的程序,当输入次数后,记录次数中正面多少次,反面多少次,以及最多连续正面多少次,以及反面多少次。

mport random

counts = int(input("请输入抛硬币的次数:"))
i = 0
z = sum = 0
y = sum = 0
a = sum = 0
b = sum = 0
e = 0
f = 0

print("开始抛硬币实验:")
while i < counts: #当当前次数还没达到指定次数时:
    num = random.randint(1, 10) #num为1~10中任意一个数字

    if num % 2: #如果num可以被2整除
        b = b * 0 #当反面抛到正面,连续计数归0
        print("正面", end=" ") #显示正面
        a = a + 1 #当前连续数
        if a > e: e = a #如果当前连续数大于之前连续数,则覆盖之前连续数。
        z = z + 1 #每num可以被整除一次,这里计数一次。

    else: #以上条件不成立的话
        a = a * 0 #当正面抛到反面,连续计数归0
        print("反面", end=" ") #显示反面
        b = b + 1 #当前连续数
        if b > f: f = b ##如果当前连续数大于之前连续数,则覆盖之前连续数。
        y = y + 1 #每num可以被整除一次,这里计数一次。


    i += 1 #每循环一次,增加数字1,代表已进行的循环次数。
print("一共模拟了" ,i, "次抛硬币")
print("正面",z,"次")
print("反面",y,"次")

print("最多连续正面", e, "次")
print("最多连续反面", f, "次")

这里最难的其实就是记连续正面/反面的次数,我看了老师的参考答案,简单来说:看不懂,真的。

import random

counts = int(input("请输入抛硬币的次数:"))

# 利用 ignore 变量来判断是否打印每次的结果
if counts > 100:
    ignore = True
else:
    ignore = False

heads = 0 # 统计正面的次数
tails = 0 # 统计反面的次数

last = 0 # 记录上一次的状态,如果是正面设置为1, 反面则设置为2
c_heads = 0 # 统计连续正面的次数
c_tails = 0 # 统计连续反面的次数
max_heads = 0 # 统计连续正面的最多次数
max_tails = 0 # 统计连续反面的最多次数

i = 0
print("开始抛硬币实验……")
while i < counts:
    num = random.randint(1, 10)

    if num % 2:
        heads += 1
        c_heads += 1

        if not ignore:       
            print("正面", end=" ")

        # 如果上一次是反面:将连续正面的次数设置为1
        if last == 2:
            c_heads = 1

        # 判断连续正面的次数是否比max_heads大,如果是,取而代之
        if c_heads > max_heads:
            max_heads = c_heads

        # 将上一次的状态设置为正面
        last = 1
    else:
        tails += 1
        c_tails += 1
        
        if not ignore:
            print("反面", end=" ")

        # 如果上一次是正面:连续反面的次数设置为1
        if last == 1:
            c_tails = 1

        # 判断连续反面的次数是否比max_tails大,如果是,取而代之
        if c_tails > max_tails:
            max_tails = c_tails

        # 将上一次的状态设置为反面
        last = 2
        
    i += 1

print("")
print("一共模拟了", counts, "次抛硬币,结果如下:")
print("正面:", heads, "次", sep="")
print("反面:", tails, "次", sep="")
print("最多连续正面:", max_heads, "次", sep="")
print("最多连续反面:", max_tails, "次", sep="")

那一瞬间,我大致明白了程序员为什么对之前技术人员写的代码深恶痛绝了。看代码太花时间了,有这个时间还真不如自己写一个。

我的代码其中最取巧的地方,就是用 *0的方式来清空之前的连续数。当正面的硬币翻到反面时,原来比如计数10,那么在进入在进入反面代码块中时,我就让它*0,这样就清空之前的连续数了。

其他的跟老师大差不差,差别最大的就是我很难分清到底哪个是定量名称哪个是函数名称(英语好了不起吗?啊?)。

第三节课是循环,简称圆环套圆环娱乐城。

在循环里,再增加循环。循环中的循环加分支中的分支,讲道理,这比脑筋急转弯刺激。课后作业也是折磨的我快疯了,写出来没几行,可是字字都是血泪啊。

第一个作业:

将九九乘法表倒过来打:

i = 1 #第二列数字
while i <= 9: #99乘法表嘛,自然数字不能超过9 
    j = 9 #第一列数字
    while j >= 1: # 如果 第一列数字大过第二列数字则进入循环
        print(j,"*",i,"=",j*i," ",end="",sep="")#输出j*i=j*i(前面是文字,这里是计算结果)
        if j == i : #当第一列和第二列数字相等时
            break #终止本次循环
        j -=1 #第一列数字减1
    print() #每一次循环结束空一行
    i +=1 #每次循环结束,第二列数字加1,重新回到while处开始进行判断

实际效果如下:

这里最大的难关是……每一步都是。当然写完之后再看,就觉得还好啦,哪有难的地方。但是让我现在重写一次,我估计还是趴。

这就是传说中的一看就会,一做就废。

其中还有两个小代码,end=”“和sep=”“。作用是

end = “” 不换行,”为每行结尾处的字样,在循环语句内,所有内容一行显示完全。

sep = “” 本行之间多个字符之间的空格用”里的字样代替。

原始:print(“1+”, “1+1 = “, 1)1+ 1+1 = 1

循环两次:end = “”后:1+ 1+1 = 1 1+ 1+1 = 1

sep = “”后:1+1+1 = 1

第二个作业更丧病:
计算10以内的素数,合数则以乘积公式的方式打印出来。

当我看到这个题目的时候,我第一时间是去百度了一下,什么叫素数。我当然知道这是小学水平的事情,但是我也很坚信我的数学水平在小学三年级应该拿不到及格分。

所以我很坦诚的去百度了一下。

然后是逻辑上的难点,讲道理,这种题目难的还真的不是动手。而是你能根据题目把要素拆解成代码。动手五分钟,想要五个小时,大概就是这个意思。

n = 2 #最小的素数就是2,你看,这就是百度后的我,多么的厉害
m = n - 1 # 一个合数,一定可以被 2 ~ 合数自己-1之间的某个数字整除。这也是百度后的成长,厉害吧。
while n <= 9: #当数字小于9的时候进入循环,因为计算的是9以内的素数,所以这里是9。
    if n % m == 0 and m == 1: #如果n可以被m整除,且m等于1的话
       print(n, "是素数") #打印n,这货是素数。这也就是素数的特征,素数只能被自己以及1整除。
       n = n + 1 #这个分支结束,要进入循环了,进行下一个数字的判断。所以是+1.
       m = n - 1#如上所说,合数2 ~ 合数-1之间的一个数整除。n+1了,m就要-1.
    elif n % m == 0 : #如果n可以被m整除:
       x = int(n / m) #得出n/m的商
       print(n, "=", m, "*", x)#输出n=m*商
       n = n + 1 #如上所述,不再赘述。
       m = n - 1
    elif n % m != 0 and m != 1:#如果n不能被m整除,且m也不等于1的话。
        m = m - 1 #m-1
n = n + 1 #内部判断完成后,n+1,重新进行判断循环

逻辑上最复杂的点是,n-m的结果如果不是被整除,或者m=1,那么m就需要继续-1.一直减到可以被整除或者m为1的情况。只有这样才能判断到底是素数还是合数。

今天的日记由衷的感谢百度,帮我补了小学生课堂上的知识。

而且今天是真的累,各种逻辑要人老命啊。

胭惜雨

2020年12月23日

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据