Python基础随笔一(MOOC)

前言

本文材料均来自于MOOC的免费课程Python程序设计(https://www.icourse163.org/course/BIT-268001

python基础的随笔更多是偏向于我个人代码实现和讨论,所以对于知识点不会有一个比较输入的说明,知识点可能会在之后系列再做总结。如果后面总结知识点我大概率会手打,截图属实起不到加强记忆的效果,如果可以我会尽量做一个知识点目录(同参考课程进度)

概述

有这次的①包含有从0-3周课程的代码实例,也包括Python123里的作业部分实例代码,以及运行结果。总体描述方式就是类似下图
随笔大致的描述流程

主体

1.基本语法元素

①实例:温度转换

要求

实现华摄氏度(F)与摄氏度(C)的转换
自动根据最后的符号判断输入的是什么类型的温度计量并转换

分析

题设要求有对于两个单位之间的转换以及识别
所以会用到两者之间的转换公式。

摄氏=5/9(°F-32)
华氏°F=℃×9/5+32

对于单位的F和C的识别要通过最后一个字符的识别来进行判断。

输入设定变量[-1]

代码部分

TempStr = input("请输入带有符号的温度值: ")
if TempStr[-1] in ['F', 'f']:
    C = (eval(TempStr[0:-1]) - 32)/1.8
    print("转换后的温度是{:.2f}C".format(C))
elif TempStr[-1] in ['C', 'c']:
    F = 1.8*eval(TempStr[0:-1]) + 32
    print("转换后的温度是{:.2f}F".format(F))
else:
    print("输入格式错误")

运行结果

摄氏度转华氏度

请输入带有符号的温度值: 12C
转换后的温度是53.60F

华氏度转摄氏度

请输入带有符号的温度值: 53F
转换后的温度是11.67C

②作业:Hello World的条件输出

要求

获得用户输入的一个整数,参考该整数值,打印输出"Hello World",要求:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬
如果输入值是0,直接输出"Hello World"‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬
如果输入值大于0,以两个字符一行方式输出"Hello World"(空格也是字符)‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬
如果输入值小于0,以垂直方式输出"Hello World"

分析

这里的要求就是条件判断决定走哪一条分支,一共三条,流程图如下:(UML建模的基础图,这里就不按照严格的画法和描述了)
分支流程

代码

n = eval(input())
if n == 0:
    print("Hello World")
elif n > 0:
    print("He\nll\no \nWo\nrl\nd")
else:
    for c in "Hello World":
        print(c)

运行结果

输入>0,每两个字符进行一次换行

1
He
ll
o 
Wo
rl
d

进程已结束,退出代码0

输入0,直接输出

0
Hello World

进程已结束,退出代码0

输入<0,垂直输出

-1
H
e
l
l
o
 
W
o
r
l
d

进程已结束,退出代码0

③作业:数值运算

要求

获得用户输入的一个字符串,格式如下:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬
M OP N‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬
其中,M和N是任何数字,OP代表一种操作,表示为如下四种:+, -, *, /(加减乘除)‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬
根据OP,输出M OP N的运算结果,统一保存小数点后2位。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬
注意:M和OP、OP和N之间可以存在多个空格,不考虑输入错误情况。

示例:

输入 输出
10+100 110.00
1/20 0.05

分析

简单的计算
保留小数点后两位

{:.2f}

代码

a=input()
print("{:.2f}".format(eval(a)))

运行结果

10+100
110.00

进程已结束,退出代码0
1/20
0.05

进程已结束,退出代码0

2.基本图形绘制

①实例:蟒蛇绘制

要求

绘制一条蟒蛇

分析

利用Python的turtle库进行绘图

准备工作:需要下载turtle库
步骤(win10):
①win+r
②输入cmd,进入命令行界面
③输入 pip install turtle
后面需要什么库就把后面的换成库的名字,如果下载速度很慢可以从国内的镜像下载
临时使用:
可以在使用pip的时候加参数-i https://pypi.tuna.tsinghua.edu.cn/simple
例如:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 库名,
这样就会从清华这边的镜像去安装库。
永久修改办法:
windows下,直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,新建文件pip.ini,内容如下
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

这个方法也是来自于csdn的帖子解决pip install 速度很慢的方法

代码

import turtle
turtle.setup(650,350,200,200)
turtle.penup()
turtle.fd(-250)
turtle.pendown()
turtle.pensize(25)
turtle.pencolor("purple")
turtle.seth(-40)
for i in range(4):
    turtle.circle(40,80)
    turtle.circle(-40,80)
turtle.circle(40,80/2)
turtle.fd(40)
turtle.circle(16,180)
turtle.fd(40*2/3)
turtle.done()

运行结果

这个过程是动态的而不是一瞬间呈现结果,展现给我们的是绘制的全过程
绘制蟒蛇代码运行结果

②作业:turtle八边形绘制

要求

使用turtle库,绘制一个八边形。
八边形效果如下:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬

‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫八边形

分析

这种规范图形需要计算转角度数就行了,这里就是
360/8=45
旋转8次45度,每次行进一定距离,这里设定100

代码

import turtle as t
t.pensize(2)
for i in range(8):
    t.fd(100)
    t.left(45)

运行结果

在这里插入图片描述

③作业:turtle绘制8角形

要求

使用turtle库,绘制一个八角图形。
在这里插入图片描述

代码

import turtle as t
t.pensize(2)
for i in range(8):
    t.fd(150)
    t.left(135)

计算循环和角度的乘积,应该为360的整数倍

运行结果

在这里插入图片描述

3.基本数据类型

①实例:天天向上的力量-工作日的努力

问题

  • 工作日模式要努力到什么水平,才能和每天努力1%一样?
  • A君:一年365天,每天进步1%,不停歇
  • B君:一年365天,每周工作5天休息2天,休息日下降1%,要多努力呢?

分析

我们可以先计算A君最后的效果
在这里插入图片描述
老师给出的方法是利用计算机的计算力直接试错

代码

试错方式的代码:

def dayUP(df):
    dayup = 1
    for i in range(365):
       if i % 7 in [6,0]:
           dayup = dayup*(1 - 0.01)
       else:
           dayup = dayup*(1 + df)
    return dayup
dayfactor = 0.01
while dayUP(dayfactor) < 37.78:
    dayfactor += 0.001
print("工作日的努力参数是:{:.3f} ".format(dayfactor))

运行结果

工作日的努力参数是:0.019 

进程已结束,退出代码0

②实例:文本进度条-简答的开始

要求

进行简单的进度条模拟,不进行动态刷新采用向下推进

代码

import time
scale = 10
print("------执行开始------")
for i in range(scale+1):
    a = '*' * i
    b = '.' * (scale - i)
    c = (i/scale)*100
    print("{:^3.0f}%[{}->{}]".format(c,a,b))
    time.sleep(0.1)
print("------执行结束------")

运行结果

------执行开始------
 0 %[->..........]
10 %[*->.........]
20 %[**->........]
30 %[***->.......]
40 %[****->......]
50 %[*****->.....]
60 %[******->....]
70 %[*******->...]
80 %[********->..]
90 %[*********->.]
100%[**********->]
------执行结束------

进程已结束,退出代码0

③实例:文本进度条-完整版

要求

动态刷新,只在该行进行系列刷新活动

分析

基于简单版本需要都与一部分的文本进行覆盖操作

代码

import time
scale = 50
print("执行开始".center(scale//2, "-"))
start = time.perf_counter()
for i in range(scale+1):
    a = '*' * i
    b = '.' * (scale - i)
    c = (i/scale)*100
    dur = time.perf_counter() - start
    print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,dur),end='')
    time.sleep(0.1)
print("\n"+"执行结束".center(scale//2,'-'))

运行结果

-----------执行开始----------
100%[**************************************************->]5.00s
-----------执行结束----------

进程已结束,退出代码0

④作业:平方根格式化

要求

获得用户输入的一个整数a,计算a的平方根,保留小数点后3位,并打印输出。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬
输出结果采用宽度30个字符、右对齐输出、多余字符采用加号(+)填充。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬
如果结果超过30个字符,则以结果宽度为准。

分析

本题需理解格式化输出的方法。

注意:如果平凡根后产生一个复数,由于复数的实部和虚部都是浮点数,.3f可以将实部和虚部分别取三位小数。

代码

a = eval(input())
print("{:+>30.3f}".format(pow(a, 0.5)))

运行结果

232
++++++++++++++++++++++++15.232

进程已结束,退出代码0
-232
+++++++++++++++++0.000+15.232j

进程已结束,退出代码0

⑤作业:字符串分段组合

要求

获得输入的一个字符串s,以字符减号(-)分割s,将其中首尾两段用加号(+)组合后输出。

输入 输出
Alice-Bob-Charis-David-Eric-Flurry Alice+Flurry

分析

s.split(k)以k为标记分割s,产生一个列表。本题需求就是掌握split()的用法。

代码

s = input()
ls = s.split("-")
print("{}+{}".format(ls[0], ls[-1]))

运行结果

Alice-Bob-Charis-David-Eric-Flurry
Alice+Flurry

进程已结束,退出代码0

后注

这三章的代码难度不是很,也不是很长,但是对于部分函数的使用还是有着一定要求的,或许不使用函数也有写发但是使用函数毫无疑问会大大降低代码量。但是有时候我也很疑惑,因为以前也曾听过代码的使用月是使用一些函数的时候可能会使得这程序耗费的时间增加,以及程序出错之后不知道原因在哪。这很致命。比如再分割字符串的实例里面的split()函数,我查阅了它的源码。
如下:

public String[] split(String regex, int limit) {
    
    
        /* fastpath if the regex is a
         (1)one-char String and this character is not one of the
            RegEx's meta characters ".$|()[{^?*+\\", or
         (2)two-char String and the first char is the backslash and
            the second is not the ascii digit or ascii letter.
         */
        char ch = 0;
        if (((regex.value.length == 1 &&
             ".$|()[{^?*+\\".indexOf(ch = regex.charAt(0)) == -1) ||
             (regex.length() == 2 &&
              regex.charAt(0) == '\\' &&
              (((ch = regex.charAt(1))-'0')|('9'-ch)) < 0 &&
              ((ch-'a')|('z'-ch)) < 0 &&
              ((ch-'A')|('Z'-ch)) < 0)) &&
            (ch < Character.MIN_HIGH_SURROGATE ||
             ch > Character.MAX_LOW_SURROGATE))
        {
    
    
            int off = 0;
            int next = 0;
            boolean limited = limit > 0;
            ArrayList<String> list = new ArrayList<>();
            while ((next = indexOf(ch, off)) != -1) {
    
    
                if (!limited || list.size() < limit - 1) {
    
    
                    list.add(substring(off, next));
                    off = next + 1;
                } else {
    
        // last one
                    //assert (list.size() == limit - 1);
                    list.add(substring(off, value.length));
                    off = value.length;
                    break;
                }
            }
            // If no match was found, return this
            if (off == 0)
                return new String[]{
    
    this};
 
            // Add remaining segment
            if (!limited || list.size() < limit)
                list.add(substring(off, value.length));
 
            // Construct result
            int resultSize = list.size();
            if (limit == 0) {
    
    
                while (resultSize > 0 && list.get(resultSize - 1).length() == 0) {
    
    
                    resultSize--;
                }
            }
            String[] result = new String[resultSize];
            return list.subList(0, resultSize).toArray(result);
        }
        return Pattern.compile(regex).split(this, limit);
    }

可以说对我现在而言阅读起来依然有不明白的地方,日后还是需要再多看看,输入理解。
如果文章对你有所帮助,可以加入收藏做为小笔记哦。若文中有问题也可以评论指出,方便小的加以修改。感谢!在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44922487/article/details/113520479