学python第一课-初识Python

学python第一课-初识Python

前言


我只是个学python拖了好久的小萌新,一直要学一直要学,刚来注册说到现在,终于开始了。。

也不是特别萌新,会一个小语言(底子好),会一点bat(批处理),python基础知识也了解的不少了,编程逻辑自认为还可以。

这几个月一直在找适合自己的教程,看过几百本电子书,看过无数新老视频教程,最后还是决定用 骆昊大大 的:Python - 100天从新手到大师(zzzain46大大友情推荐)

我会把文章中需要的知识点和内容精简粘贴上来,偶尔给出自己的一些想法(想法用删除线表示)

由于文章是给自己看的,所以肯定会精简掉不需要的东西,想学建议看原教程那里的

大纲是原文大纲,仅供参考,我的文章肯定删减了许多

可能太简单了,勿喷!(主要是给自己看的)

然后软件方面,没有用PyCharm,在用VS Code,还有IDLE

python 版本:3.8.1

操作系统:Windows 10

ps:注释超详细哈哈,没事闲的,里面可能有错误

要牢记的话


感谢:https://github.com/jackfrued/Python-100-Days

  • Make English as your working language. (让英语成为你的工作语言)
  • Practice makes perfect. (熟能生巧)
  • All experience comes from mistakes. (所有的经验都源于你犯过的错误)
  • Don’t be one of the leeches. (不要当伸手党)
  • Either outstanding or out. (要么出众,要么出局)

大纲

Day01 - 初识Python

  • Python简介 - Python的历史 / Python的优缺点 / Python的应用领域
  • 搭建编程环境 - Windows环境 / Linux环境 / MacOS环境
  • 从终端运行Python程序 - Hello, world / print函数 / 运行程序
  • 使用IDLE - 交互式环境(REPL) / 编写多行代码 / 运行程序 / 退出IDLE
  • 注释 - 注释的作用 / 单行注释 / 多行注释

初识Python

Python简介

Python的历史

2000年:Python 2.0 发布

2008年:Python 3.0 发布

2018年:Python 3.7.x 发布

2019年10月:Python 3.8.x 发布(来源

Python的版本号分为三段,形如A.B.C。其中A表示大版本号,一般当整体重写,或出现不向后兼容的改变时,增加A;B表示功能更新,出现新功能时增加B;C表示小的改动(例如:修复了某个Bug),只要有修改就增加C。如果对Python的历史感兴趣,可以阅读名为《Python简史》的网络文章。

Python的应用领域

目前Python在Web应用后端开发云基础设施建设DevOps网络数据采集(爬虫)自动化测试数据分析机器学习等领域都有着广泛的应用。(目前偏向学爬虫,但还是先把基础学好吧。。)

安装Python解释器

可以在Python官方网站下载到Python的Windows安装程序(exe文件)

安装过程建议勾选“Add Python 3.x to PATH”(将Python 3.x添加到PATH环境变量)并选择自定义安装,在设置“Optional Features”界面最好将“pip”、“tcl/tk”、“Python test suite”等项全部勾选上

强烈建议选择自定义的安装路径并保证路径中没有中文。安装完成会看到“Setup was successful”的提示

运行Python程序

确认Python的版本

可以在cmd窗口输入

1
python --version

输出:Python 3.8.1

也可以先输入python进入交互式环境,再执行以下的代码检查Python的版本。

1
2
3
4
import sys

print(sys.version_info)
print(sys.version)

输出:sys.version_info(major=3, minor=8, micro=1, releaselevel=’final’, serial=0)

输出:3.8.1 (tags/v3.8.1:1b293b6, Dec 18 2019, 23:11:46) [MSC v.1916 64 bit (AMD64)]

编写Python源代码

可以用文本编辑工具(推荐使用SublimeVisual Studio Code等高级文本编辑工具,这里我用的是VS Code)编写Python源代码并用py作为后缀名保存该文件(比如说:1.py),代码内容如下所示。

1
print('hello, world!')

运行程序

切换到源代码所在的目录并执行下面的命令,看看屏幕上是否输出了”hello, world!”。

1
python 1.py

代码中的注释

注释是编程语言的一个重要组成部分,用于在源代码中解释代码的作用从而增强程序的可读性和可维护性,当然也可以将源代码中不需要参与运行的代码段通过注释来去掉,这一点在调试程序的时候经常用到。注释在随源代码进入预处理器或编译时会被移除,不会在目标代码中保留也不会影响程序的执行结果。

  1. 单行注释 - 以#和空格开头的部分
  2. 多行注释 - 三个引号开头,三个引号结尾
1
2
3
4
5
6
7
8
9
"""
第一个Python程序 - hello, world!
向伟大的Dennis M. Ritchie先生致敬

Version: 0.1
Author: 骆昊
"""
print('hello, world!')
# print("你好, 世界!")

Python开发工具

IDLE - 自带的集成开发工具

IDLE是安装Python环境时自带的集成开发工具,如下图所示。但是由于IDLE的用户体验并不是那么好所以很少在实际开发中被采用。

IPython - 更好的交互式编程工具

IPython是一种基于Python的交互式解释器。相较于原生的Python交互式环境,IPython提供了更为强大的编辑和交互功能。可以通过Python的包管理工具pip安装IPython,具体的操作如下所示。

1
pip install ipython

安装成功后,可以通过下面的ipython命令启动IPython,如下图所示。

这里的图是Linux的,Windows 输入:ipython 进入

练习

1. 在Python交互式环境中输入下面的代码并查看结果,请尝试将看到的内容翻译成中文。

1
import this

说明:输入上面的代码,在Python的交互式环境中可以看到Tim Peter撰写的Python之禅,里面讲述的道理不仅仅适用于Python,也适用于其他编程语言。

输出:

The Zen of Python, by Tim Peters

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!

翻译

《Python之禅》 -Tim Peters

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.(虽然这种方案并不是显而易见的,因为你不是那个荷兰人^这里指的是Python之父Guido^) Now is better than never.(现在开始做比不做好)
Although never is often better than right now.(不做比盲目去做好^极限编程中的YAGNI原则^)
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!(命名空间非常有用,我们应当多加利用)

2. 学习使用turtle在屏幕上绘制图形。

说明:turtle是Python内置的一个非常有趣的模块,特别适合对计算机程序设计进行初体验的小伙伴,它最早是Logo语言的一部分,Logo语言是Wally Feurzig和Seymour Papert在1966发明的编程语言。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import turtle #加载turtle模块

turtle.pensize(4) #笔🖊的大小
turtle.pencolor('red') #笔🖊的颜色

#起始在 (0,0),笔🖊的默认方向是右边,也就是朝着x轴正方向
turtle.forward(100) #向前画100个像素,也就是向右边画100个像素 👉
turtle.right(90) #向右转90°
turtle.forward(100) #向前画100个像素,也就是向下边画100个像素 👇
turtle.right(90) #向右转90°
turtle.forward(100) #向前画100个像素,也就是向左边画100个像素 👈
turtle.right(90) #向右转90°
turtle.forward(100) #向前画100个像素,也就是向上边画100个像素 👆

turtle.mainloop() #开始事件循环,看了半天我也不太懂

这些地方介绍Turtle挺详细的:

https://docs.python.org/zh-cn/3/library/turtle.html

https://www.cnblogs.com/chen0307/articles/9645138.html

提示:本章提供的代码中还有画国旗和画小猪佩奇的代码,有兴趣的读者请自行研究。(比如说我,就有兴趣)

用Python的turtle模块绘制国旗

(好难呀,突然没了兴趣哈哈,不过有编程基础的我还是看得懂的!)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
"""
用Python的turtle模块绘制国旗
"""
import turtle #加载turtle模块


def draw_rectangle(x, y, width, height): #这里是函数:画矩形;需要给出变量x点,y点,宽度(像素),还有高度(像素)
turtle.goto(x, y) #假设给的变量x=0, y=0,那么这条命令就是去到(0,0)
turtle.pencolor('red') #笔的颜色设定为红
turtle.fillcolor('red') #填充颜色(就是画图软件那个桶一样的东西~)

#这里我是通过 turtle.delay(1000) 来观察到的
turtle.begin_fill() #开始填充,应该是要填充end_fill之前,所有走过的点中间,所以准确的说,是开始设定填充位置
for i in range(2): #执行两次,别问,问就是长方形 = 2个 宽+高
turtle.forward(width) #向右边画 %宽度% 个像素,别问我为什么用cmd的变量%% 👉(第二遍👈)
turtle.left(90) #向左转90°
turtle.forward(height) #向下边画 %高度% 个像素,别问我为什么用cmd的变量%% 👆(第二遍👇)
turtle.left(90) #向左转90°
turtle.end_fill() #结束设定填充位置,也就是开始填充(什么鬼),这时候走过的四个点中间就会填充红色了


#看了半天终于看懂了这个函数,具体图片介绍在下面 知识点2
def draw_star(x, y, radius): #这里是函数:画五角星;需要给出变量x点,y点,还有半径(像素)
turtle.setpos(x, y) #前往(x,y),感觉这步没啥用呀。。是我感觉错了吗
pos1 = turtle.pos() #设定当前位置为第1个外面的点
turtle.circle(-radius, 72) #现在画笔朝下,往左下画一个看不见的弧度
pos2 = turtle.pos() #设定当前位置为第2个外面的点
turtle.circle(-radius, 72) #以弧度来移动
pos3 = turtle.pos()#设定当前位置为第3个外面的点
turtle.circle(-radius, 72) #以弧度来移动
pos4 = turtle.pos()#设定当前位置为第4个外面的点
turtle.circle(-radius, 72) #以弧度来移动
pos5 = turtle.pos()#设定当前位置为第5个外面的点
turtle.color('yellow', 'yellow') #第一个是画笔颜色,第二个是填充颜色

turtle.begin_fill() #开始定位

#这里就是画五角星了,都知道是咋画的吧
#右横,左下,右上,右下,左上
turtle.goto(pos3)
turtle.goto(pos1)
turtle.goto(pos4)
turtle.goto(pos2)
turtle.goto(pos5)

turtle.end_fill() #结束定位,开始填充


def main(): #主函数
turtle.speed(12) #画笔🖊 “移动速度”
turtle.penup() #关闭画笔🖊,也就是画笔🖊抬起
x, y = -270, -180 #长方形左下角的 x轴,y轴

# 画国旗主体
width, height = 540, 360 #矩形的 宽,高
draw_rectangle(x, y, width, height) #调用画矩形的函数

# 画大星星
pice = 22 #不知道这个变量是干啥的
center_x, center_y = x + 5 * pice, y + height - pice * 5 #不知道怎么算出这个中心点的
turtle.goto(center_x, center_y) #画笔去到大星星中心点
turtle.left(90) #画笔转到右边👉
turtle.forward(pice * 3) #往右走👉
turtle.right(90) #画笔转到下边👇
draw_star(turtle.xcor(), turtle.ycor(), pice * 3) #调用画星星函数,给出当前画笔x轴,y轴,还有半径


x_poses, y_poses = [10, 12, 12, 10], [2, 4, 7, 9] #设定四个小星星的

# 画小星星
for x_pos, y_pos in zip(x_poses, y_poses): #这里举个例子,第一次for,x_pos = 10; y_pos = 2

#这里经过一系列复杂的定位,管他呢
turtle.goto(x + x_pos * pice, y + height - y_pos * pice)
turtle.left(turtle.towards(center_x, center_y) - turtle.heading())
turtle.forward(pice)
turtle.right(90)

#开始画星星,先画第一个,然后重复上面for内的内容,再画第二个,最后到第五个结束(只有五个变量)
draw_star(turtle.xcor(), turtle.ycor(), pice)

# 隐藏海龟,应该也就是隐藏画笔
turtle.ht()

# 显示绘图窗口,也就是不关闭窗口
turtle.mainloop()


if __name__ == '__main__': #这里是程序开始处了,具体的在下面看知识难点1
main() #调用main主函数

参考资料:

https://docs.python.org/zh-cn/3/library/turtle.html

https://blog.csdn.net/Dian1pei2xiao3/article/details/90214627

https://www.runoob.com/python/python-func-zip.html

https://www.runoob.com/python/att-time-sleep.html


知识难点1,if name == ‘main‘:
1
if __name__ == '__main__':

这就相当于是 Python 模拟的程序入口。Python 本身并没有规定这么写,这只是一种编码习惯。由于模块之间相互引用,不同模块可能都有这样的定义,而入口程序只能有一个。到底哪个入口程序被选中,这取决于 __name__ 的值。

我们简单的理解就是: 如果模块是被直接运行的,则代码块被运行,如果模块是被导入的,则代码块不被运行

我知道你没有明白哈哈,简单的总结了一下,不知道说的够不够详细,原文(也就是相关资料1)太长,想了解的可以要去看看,说的挺好的

假如说,我写了2个py程序

1.py:

1
2
3
4
5
6
alittlebear = 666

def main():
print ("alittlebear = ", alittlebear)

main()

start.py:

1
2
3
4
5
6
7
8
9
from 1 import alittlebear

def main():
print ("alittlebear = ", alittlebear)

alittlebear2 = alittlebear * 2
print ("alittlebear * 2 = ", alittlebear2)

main()

cmd运行:python start.py (当然是跟两个py文件在同一个文件夹内)

输出:

1
2
3
alittlebear = 666
alittlebear = 666
alittlebear = 1332

alittlebear = 666 出现了两次,原因是第一个文件的print也运行了,所以,修改为下面即可避免发生这样的情况:

1.py:

1
2
3
4
5
6
7
alittlebear = 666

def main():
print ("alittlebear = ", alittlebear)

if __name__ == '__main__':
main()

再次运行,输出:

1
2
alittlebear = 666
alittlebear = 1332

差不多就是这样

相关资料:

https://blog.konghy.cn/2017/04/24/python-entry-program/

https://www.zhihu.com/question/49136398

https://www.runoob.com/python/python-operators.html

https://blog.csdn.net/weixin_34310369/article/details/94608909

https://www.jianshu.com/p/9270aa5468c0


知识难点2,draw_star函数

这里是代码:

1
2
3
4
5
6
7
8
9
10
11
12
def draw_star(x, y, radius): #这里是函数:画五角星;需要给出变量x点,y点,还有半径(像素)
turtle.setpos(x, y) #前往(x,y),感觉这步没啥用呀。。是我感觉错了吗
pos1 = turtle.pos() #设定当前位置为第1个外面的点
turtle.circle(-radius, 72) #现在画笔朝下,往左下画一个看不见的弧度
pos2 = turtle.pos() #设定当前位置为第2个外面的点
turtle.circle(-radius, 72) #以弧度来移动
pos3 = turtle.pos()#设定当前位置为第3个外面的点
turtle.circle(-radius, 72) #以弧度来移动
pos4 = turtle.pos()#设定当前位置为第4个外面的点
turtle.circle(-radius, 72) #以弧度来移动
pos5 = turtle.pos()#设定当前位置为第5个外面的点
turtle.color('yellow', 'yellow') #第一个是画笔颜色,第二个是填充颜色

下面是画一个星星的慢动作gif(我不加载time模块能这么容易的录到吗)

1

刚才为了了解的更清楚,我没在开始加上turtle.penup,下面是正常的样子:(颜色没改)

1

应该懂了吧!(温馨提示:一圈 = 360°,360° / 5 = 72°)

附送最后一个gif的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import time
import turtle


turtle.penup()

turtle.right(100)

time.sleep(4)


pos1 = turtle.pos() #设定当前位置为第1个外面的点

turtle.circle(-100, 72) #现在画笔朝下,往左下画一个看不见的弧度
pos2 = turtle.pos() #设定当前位置为第2个外面的点
turtle.circle(-100, 72) #以弧度来移动
pos3 = turtle.pos()#设定当前位置为第3个外面的点
turtle.circle(-100, 72) #以弧度来移动
pos4 = turtle.pos()#设定当前位置为第4个外面的点
turtle.circle(-100, 72) #以弧度来移动
pos5 = turtle.pos()#设定当前位置为第5个外面的点

turtle.color('black', 'black') #第一个是画笔颜色,第二个是填充颜色




turtle.begin_fill()
turtle.goto(pos3)
turtle.goto(pos1)
turtle.goto(pos4)
turtle.goto(pos2)
turtle.goto(pos5)
turtle.end_fill()



turtle.mainloop()

总结

  1. 了解了python的历史
  2. 安装了python
  3. 阅读了《Python之禅》
  4. 会简单用IDLE,VS Code编写并运行python源代码
  5. 熟悉了turtle模块(学了几个小时,大部分时间都浪费在学画画上哈哈)
  6. 简单了解time模块

所有用到的链接

疑问

(删除的已解决)

  1. turtle.mainloop() 我不太懂,看了好几个文档,似乎是画完了不会关闭窗口? 这个就是结束不会关闭装口
  2. alittlebear = alittlebear * 2 这样有办法实现吗,只用一个变量? alittlebear *= 2 即可
  3. 知识难点1中,main函数出现了两次,我在start.py运行时,电脑怎么判断我要运行哪个?
  4. 画星星函数开头中的 turtle.setpos(x, y) 有啥用?
评论

:D 一言句子获取中...

加载中,最新评论有1分钟缓存...