Python之路

  1. 计算机的历史
  2. 操作系统
  3. 计算机基础知识
  4. Python 2.x和3.x
  5. Python在交互器模式下的执行
  6. 第一个Python程序:hello world!
  7. 用户输入
  8. Python中的注释
  9. 变量
  10. if语句
  11. 运算符
  12. while循环

一、计算机的历史

计算机最初是用来进行计算的。

历史上第一台机械计算机是法国数学家帕斯卡于1642年发明的帕斯卡加法器,只能够做加减法运算。

1674年,莱布尼茨在帕斯卡加法器的基础上,为计算机增添了一种加“步进轮”的装置,从而就能够进行连续重复的加减法运算,连续重复的加减法运算是现代计算机进行乘除法的方法,因此莱布尼茨发明的计算机可以进行加减乘除四则运算。

1790年,法国机械师杰卡德改进了提花机的构想,发明了自动提花机,能够同时操纵1200的编织针,在后来电子计算机最初发展的几年,多款计算机中都能够找到自动提花机的身影。

1822年,巴贝奇发明了第一台差分机,它可以处理3个不同的5位数,计算精度达到6位小数。

1843年,巴贝奇提出了一个更大胆的设计——通用的数字计算机,也就是分析机,此后又有拜伦之女阿达奥古斯塔的加盟,阿达甚至成为史上第一位为计算机编写程序的人,遗憾的是,两个人穷尽一生也没有把分析机制造出来,他们提出的分析机构想至少超出了他们所处时代一个世纪。

1890年,霍列瑞斯在美国做人口普查,由他设计的机器,只用了6周时间就得出了准确的数据。杰卡德和霍列瑞斯分别开创了程序设计和数据处理的先河,它们构成了电脑“软件的”雏形。

1896年,霍列瑞斯创办了IBM的前身。

1906年,美国的德福雷斯特发明了电子管,为计算机的发展奠定了基础。

1907年,德雷弗斯特向美国专利局申报了真空三极管的发明专利。真空三极管分别处于“饱和”和“截止”状态。“饱和”即从阴极到屏极的电流完全导通,相当于开关开启,“截止”即从阴极到屏极没有电流通过,相当于开关关闭。其控制速度比继电器快成千上万倍。

1924年,IBM成立,一家具有划时代意义的公司。

1944年,艾肯设计的马克1号计算机正式运行,马克1号的关键部件是继电器,它每分钟可进行200次以上运算。马克1号是最后一台“机械/电动式”计算机。

1943年,任职于宾夕法尼亚大学莫尔电机工程学院的莫希利,希望用电子管代替继电器,来提高机器计算速度。

1946年,莫希利梦想成真,世界上第二台电子计算机,第一台通用计算机埃利阿克(ENIAC,电子数学积分和计算机)诞生。埃利阿克每秒能进行5000次加法运算,每秒400次乘法运算,是机电式计算机的1000倍。

1937年,阿塔纳索夫-贝勒计算机(Atanasoff-Berry Computer,简称ABC计算机)在1937年设计,于1942年成功进行了测试。ABC计算机开创了现代计算机的重要元素,包括二进制运算和电子开关,但是不可编程,仅能用于线性运算,缺乏通用性。ABC计算机知道1960年才为人所知,当时ENIAC普遍被认为是第一台现代意义上的计算机,后来ENIAC的专利被注销,ABC被认定为世界上第一台计算机。

1945年,冯·诺依曼等人发表了计算机史上著名的“101页报告”,报告明确规定了计算机的五大部件(输入系统、输出系统、存储器、运算器、控制器),并用二进制代替十进制,大大方便了计算机的电路设计。更具革命意义的是程序也被当做数据存进了机器内部,以便电脑能自动依次执行指令,再也不用去接通那么麻烦的线路。直到今天,虽然计算机的速度已经非常非常快,但仍没有超出冯诺依曼机的设计原理。冯诺依曼是当之无愧的“计算机之父”。

二、操作系统

操作系统是特殊的软件,用于控制和管理整个计算机系统的硬件和软件,操作系统是唯一能够直接运行在计算机硬件上的软件,为其他软件的运行提供了必需的接口。

计算机的架构图:

 

操作系统的历史

1.无操作系统

最初,计算机是没有操作系统的,都是手工操作,用户需要把程序纸带装在计算机上,把程序送入计算机后才能运行程序,计算完毕后,打印出计算结果,卸下程序纸带,才能让下一个用户使用。在这个过程中,CPU等待手工操作,造成很大的资源浪费,而且操作麻烦。

 

2.批处理

输入机成批地把任务交给磁带机,然后由磁带机把任务一起交给CPU进行处理,处理完成后成批地交给输出机,这样就能够节省任务之间等待的时间,有效提高计算机的资源利用率。

 

3.脱机批处理

但是在输入输出全力进行的时候,CPU仍然处于空闲状态,这就是忙等状态。

为了解决这个问题,使输入输出脱离主机控制,增加一个卫星机,用来从输入机中读取任务放到高速磁带中,并将高速磁带中的执行结果传送给输出机,这样主机和卫星机并行工作,就可以充分发挥CPU的能力。

4.多道批处理

之前的操作系统都是单道运行,内存中只能存在一个程序,当一个程序在CPU中运行时,输入输出处于空闲状态,当需要输入输出时,CPU又处于空闲状态。只有一个程序完成后,才能让另一个程序进入内存,两者是串行的。多道运行是把多个程序都放到内存中,当程序A进行输入输出时,程序B可以在CPU中运行,当程序B进行输入输出时,程序A可以在CPU中运行,这时输入输出设备都处于工作的状态,从而提高了资源的利用率。

5.分时系统

多道批处理系统没有人机交互能力。但一个任务在执行时会独占CPU,即使CPU1分钟可以运行1000万次,如果任务必须按每分钟100次来运行,资源仍被大大地浪费。如果把CPU的运行时间分为很短的片段,任务按时间片段轮流,如果任务A在分配的时间片段内不能完成,就暂时中止,让任务B运行,各个任务轮流使用,由于CPU的速度很快,这个等待的时间人为是察觉不出来的,感觉仍然在不间断地执行,这时CPU一直在工作,提高了资源利用率。分时系统允许多个用户同时联机使用计算机。

 

6.实时系统

分时系统无法处理需要及时作出响应的任务,无法胜任实时控制和实时信息处理领域的需求。分时系统能够及时响应随机发生的外部事件,并在严格的时间范围内完成对该时间的处理。

7.通用操作系统

或同时具备多道批处理、分时、实时处理功能,或具备其中之二的功能。

1965年,Multics操作系统,多用户、多任务、多层次。Multics的目标是整合分时技术以及当时其他先进技术,允许用户在远程终端上通过电话拨号登陆到主机。但由于项目太过激进,搞的太大,最终项目被放弃。

肯汤普森开发了一个很小的操作系统,取名为Unics,与Multics意义相对,后来改为Unix。Unix被称为计算机/互联网行业的基石。由于计算机的硬件结构不同,每次安装系统时,Unix都需要重写。第一版的Unix是使用汇编语言和B语言开发的,对不同类型的计算机不能兼容,汤普森和丹尼斯·里奇在1971年发明了C语言,并在1973年重写了Unix,Unix正式发布。

同年,加州伯克利大学的Bill Joy获取了Unix的源码,对其进行了修改,并加入了许多工具软件和编译程序,并把其命名为Berkeley Software Distribution(BSD)。

1979年,Unix开始支持个人电脑。也是在这一年,出于商业考虑,AT&T决定收回Unix的版权。

1984-1986年,谭邦宁教授写了一个名叫Minix的Unix Like程序,但仅用于教育目的。

1991年,Linus Torvalds用bash、gcc等工具写了一个核心程序,并且开放了源代码,他希望这个程序能够获得大家的修改建议,从此Linux开始了他改变世界的征程。

三、计算机基础知识

计算机容量单位:

bit,简称B,是计算机能够识别的最小单位。

KB,1KB等于1000个bit

MB,1MB等于1024(210)KB

GB,1GB等于1024(210)MB,大致相当于一个蓝光电影的大小

TB,1TB等于1024(210)GB

PB,1PB等于1024(210)TB,企业级的数据量

编码:

编码表的作用是把字符转换为计算机能够识别的字节码(0和1),世界上第一张编码表是ASCII码表,该表收入了256个字符,每个字符占用8位,即为1个字节。

ASCII码表没有中文对照,第一张中文对照表是GB2312,此后还有GBK1.0,GBK18030。第一张世界通用的编码表是Unicode,也就是万国码,Unicode规定,无论是否为英文字符,都至少占用2个字节,这不仅使之前通过ASCII码表编码的字符出现乱码,也会使内存增加一倍,因此在英语国家推行困难,所以又对其进行了改进而有了UTF-8 。UTF-8是对Unicode的压缩和优化,它不再规定任何字符都至少占用2个字节,而是进行了分类:ASCII码表中的字符仍占用1个字节,欧洲字符占用2个字节,东亚字符占用3个字节。

环境变量:

环境变量指的是在操作系统中用来指定操作系统运行环境的一些参数,在Windows中为Path。用户可以使用环境变量更好地运行程序或进程。比如在上一小节,我们在用Python执行某个文件时,我们告诉了系统Python所在的完整路径,但输入一大串路径会很麻烦,那能否直接输入python启动程序呢?答案是可以的,但是必须把Python的绝对路径加到path中。

把程序加入环境变量中的方法:

第一步:右键单击“我的电脑/计算机”——>属性

第二步:单击高级系统设置,打开系统属性对话框

第三步:单击“高级”中的“环境变量”,打开环境变量对话框

第四步:在系统变量中找到path,单击“编辑”按钮,打开编辑系统变量对话框。

第五步:把python的绝对路径拷贝到“变量值”框中,注意路径之间要加英文下的分号以隔开各路径。

第六步:依次单击“确定”即可。

四、Python 2.xPython 3.x

2.x的默认编码方式是ASCII码,3.x的默认编码方式是Unicode,3.x中可以直接输入汉字,而要在2.x中输入汉字必须在第一行输入“#!-*-  coding=utf-8”,此外还会因为Python运行环境的编码方式的差异导致不必要的麻烦。3.x不在往下兼容,2.x最晚会支持到2020年,以给用户足够的时间升级,3.x是未来的趋势所在。

五、Python在交互器模式下的执行

  1. 打开交互器,windows开始键——>单击运行——>输入cmd——>单击确定(前两步快捷键:win+R)
  2. 查看当前目录:chdir(check directory)
  3. 切换磁盘:磁盘号+“:” ——>Enter键,如:F:
  4. 切换目录:cd(check directory) cd+目标目录,如:cd pyD5
  5. 用Python执行某个文件:python路径+文件路径,如..python  ..file
  6. 退出Python和交互器命令:exit()

总结:比较常用的交互器命令有:

chdir:查看当前文件夹

dir:查看当前目录下的文件夹和文件

cd:切换目录,返回上层目录:cd ..  返回上上层目录:cd ....

cls:清屏命令

exit():退出交互器

chcp:修改系统编码方式

六、第一个Python程序

需求:打印出hello,world!

实现:print(“hello, world!”)

七、用户输入

input()

input(“提示语:”)

特别要注意的一点是,用户输入的字符都是字符串类型的,不能直接进行运算,需要进行类型转换,把字符串转换为数值,int(string),相应地,把数值转换为字符串的方法是str(number),int和str分别是integer和string的前三个字母。

 1 num1 = input(“please enter the first number:")
 2 
 3 num2 = input(“please enter the first number:")
 4 
 5 print(“num1 + num2 = ”,num1+num2)
 6 
 7 执行上面的代码:
 8 
 9 >> please enter the first number:3
10 
11 >> please enter the first number:5

执行结果为num1 + num2 = 35,而不是我们想得到的8。之所以这样是因为用户输入的3和5的类型都是字符串,加号会对其进行拼接而不是计算。解决方法是把3和5转换为数值,执行下面的代码:

 1 num1 = int(input(“please enter the first number:"))
 2 
 3 num2 = int(input(“please enter the first number:"))
 4 
 5 print(“num1 + num2 = ”,num1+num2)
 6 
 7 执行上面的代码:
 8 
 9 >> please enter the first number:3
10 
11 >> please enter the first number:5
12 
13 输出结果:num1 + num2 = 8

 

八、Python中的注释

单行注释:#

多行注释:’’’注释’’’ 或 “”“注释“”“”

注释的作用是为了增加代码的可读性,即使自己明白代码的意义,为了防止日后遗忘也要加上注释,而且也是为了让别人看懂自己的代码。代码量较大时,更要养成写注释的习惯。

写注释的原则:不是写代码是怎么实现的,而是实现什么功能。

九、变量

1.变量的作用,简单地说就是存储信息,方便日后调用或操作。

2.变量的命名规则:

①   变量名要有描述性,即见文知意,比如:我们定义班级人数这个变量,num_of_class就远比用a、b、c这样的字符更明确。

②变量名要用字母、数字、下划线进行定义,不能包含空格和特殊字符。

③变量名不能以数字开头。

④变量名不能是关键字。

⑤变量名不要全部大写。因为Python不区分变量和常量,为了人为进行区分,我们把常量写成全大写。

⑥不以中文为变量名。

3.变量区分大小写,number和Number是两个不同的变量。

4.变量所占用内存的释放:(1)del命令删除变量主动释放。(2)Python的内存回收机制定时清理没有被引用的变量。

示例:

 1 name1 = beijing
 2 
 3 name2 = name1
 4 
 5 print(name1,name2)
 6 
 7 >>beijing Beijing
 8 
 9 上边四行代码很容易理解,如果把name2改为hebei 呢?
10 
11 name2 = hebei
12 
13 print(name1,name2)

#name1还是beijing,这没问题,关键是name2,这里有一个误区,很多人认为name2是指向name1的,因此name2还是等于beijing。其实在内存中,具体的指向是这样的:内存中开辟了一个空间用于存储beijing,因为name1把它指向的beijing赋值给name2,所以name1和name2都等于beijing;当把name2改为hebei时,实际上是在内存中又开辟了一个空间用于存储hebei,并使name2指向hebei,所以输出beijing Hebei.如图:

 

 1 name1 = beijing
 2 
 3 name2 = name1
 4 
 5 print(name1,name2)
 6 
 7 >>beijing Beijing
 8 
 9 name2 = hebei
10 
11 print(name1,name2)
12 
13 >>Beijing Hebei

 

十、if语句

第一种形式:

 1 if 条件:
 2 
 3   语句
 4 
 5 #如果条件成立,就执行语句。
 6 
 7 实例:
 8 
 9 if 我饿了:
10 
11   吃饭

第二种形式:

 1 if 条件:
 2 
 3   语句1
 4 
 5 else:
 6 
 7   语句2
 8 
 9 #如果条件成立,就执行语句1,否则就执行语句2.
10 
11 实例:
12 
13 if 我饿了:
14 
15   吃饭
16 
17 else:
18 
19   写代码

第三种形式:

 1 if 条件1:
 2 
 3   语句1
 4 
 5 elif 条件2:  #elif可以有多个
 6 
 7   语句2
 8 
 9 else:
10 
11   语句3
12 
13 实例:
14 
15 if 我饿了:
16 
17   吃饭
18 
19 elif 我困了
20 
21   睡觉
22 
23 else:
24 
25   写代码

小结:Python中要注意缩进,否则会出错,而且缩进级别必须相同。

比如下面的实例,elif前是一个空格,另外两个执行语句是一个制表符,就会引起缩进错误。即使在形式上,一个制表符和4个空格可以缩进相同的距离,但在Python中仍然不同,也会引起缩进错误。

实例1:

 1 if 我饿了:
 2 
 3   吃饭         #tab
 4 
 5 elif 我困了
 6 
 7 睡觉       #一个空格
 8 
 9 else:
10 
11   写代码     #tab

实例2:

 1 if guess_age = age:
 2 
 3   prinrt(“you got it…”)  #tab
 4 
 5   prinrt(“you got it…”)  #tab
 6 
 7    prinrt(“you got it…”)  #四个空格
 8 
 9   prinrt(“you got it…”)  #tab
10 
11 else:
12 
13   print(“you are wrong…”)

 

练习题:猜数游戏,先给定一个数,然后由用户输入一个数进行猜测,猜对了就输出“yes,you got it…”,猜大了就提示用户猜大了,否则就提示用户猜小了。

 1 num = 35
 2 
 3 num_guess = int(input("please enter a number:"))
 4 
 5 if num_guess == num:
 6 
 7     print("yes,you got it...")
 8 
 9 elif num_guess > num:
10 
11     print ("Is bigger")
12 
13 else:
14 
15     print("Is smaller")

十一、运算符

1.算术运算符:+  -  *  /  //(地板除,取小于实际结果的最大整数)  %(求余数)  **(求指数)

 1 5+2=7  当“+”两边是字符串的时候,“+”代表字符串的拼接
 2 
 3 5-2=3
 4 
 5 5*2=10
 6 
 7 5/2=2.5
 8 
 9 5//2=2  -5//2=-3  5//-2=-3
10 
11 5%2=1
12 
13 5**2=25

2.赋值运算符:=  +=  -=  *=  /=  //=  %=  **=

num1 +=2相当于num1 =num1+2,num1 -= 2相当于num1 = num1 -1,以此类推。

3.关系运算符:>  <  ==  >=  <=  !=

关系运算符会得到一个布尔值:True和False

 1 a = 2
 2 
 3 b = 3
 4 
 5 a > b        False
 6 
 7 a < b        True
 8 
 9 a == b       False
10 
11 a >= b       False
12 
13 a <= b       True
14 
15 a != b       True

4.逻辑运算符:and  or  not

and:

条件1 and 条件2

两个条件都为真,结果才为真,只要有一个为假,结果就为假。

or:

条件1 or 条件2

只要有一个为真,结果就为真。

not:

not 条件

真假相反

短路原则:

(1)对于and:当and前面的条件为假,那么整个表达式的结果就为假,and后面的条件不会被执行

(2)对于or:当or前面的条件为真,那么整个表达式的结果就为真,or后面的条件不会被执行。

5.运算符的优先级:

从大到小依次为:**  >  *、/、//、%  >  +、-  >  关系运算符  >  not  >  and、or  >  赋值运算符

可以通过给表达式加括号来提高优先级,比如3+2*5是先计算乘法再计算加法,结果是13,(3+2)*5先计算加法再计算乘法,结果是25.

练习题:

(1)让用户输入三个数,找出三个数的最大值/最小值

思路:因为大小是两两相互比较的,我们先比较前两个数,有两种情况:num1>num2和num1<num2,当num1>num2时,num3的大小又有三种可能:num3>num1,num3在num1和num2之间,num3<num2,在第一种可能时,最大值是num3,无论是第二种可能还是第三种可能,排在最前面的都是num1,所以最大值是num1;当num1<num2时原理相同。方法如下:

 1 num1 = input("please enter the first number:")
 2 
 3 num2 = input("please enter the second number:")
 4 
 5 num3 = input("please enter the third number:")
 6 
 7 if num1 > num2:
 8 
 9     if num3 > num1:
10 
11         print("最大值为:",num3)
12 
13     else:
14 
15         print("最大值为:",num1)
16 
17 else:
18 
19     if num3 > num2:
20 
21         print("最大值为:",num3)
22 
23     else:
24 
25         print("最大值为:",num2)

 

十二、while循环

  1. 语法:

while 条件:

         语句

当条件成立时,执行循环里的语句,直到条件不成立,退出循环。

示例1:

打印一10个#

有加法和减法两种思路:

加法:

1 num1 = 1
2 
3 while num1<=10:
4 
5   print("*")
6 
7   num1 +=1

减法:

1 num1 = 10
2 
3 while num1>0:
4 
5   print("*")
6 
7   num1 -= 1

示例2:

打印一10个#

有加法和减法两种思路:

加法:

1 num1 = 1
2 
3 while num1<=10:
4 
5   print("*",end="")
6 
7   num1 += 1
8 
9 #每执行完一次循环,不会换行。end表示结束符,默认情况下值为换行符。

减法:

1 num1 = 10
2 
3 while num1>0:
4 
5    print("*",end="")
6 
7    num1 -= 1

练习题:之前我们用if语句实现了一个猜数游戏,但是只能猜测一次,如果可以让用户猜测多次或者一直猜测下去直到猜对,该怎么实现呢?

假如用户可以猜测5次:

思路:使用while语句,循环5次,当猜对时能够退出循环。

 1 num = 35
 2 times = 5
 3 while times>0:
 4   num_guess = int(input("please enter a number:"))
 5   if num_guess == num:
 6     print("yes,you got it...")
 7     break    #break的作用是退出while循环。
 8 
 9   elif num_guess > num:
10       print ("Is bigger")
11   else:
12       print("Is smaller")
13   times -=1

假设用户可以猜无数次:

思路:使用while语句进行无数次循环,当猜对时能够退出循环。

 1 num = 35
 2 
 3 flag = True
 4 
 5 while flag:
 6 
 7     num_guess = int(input("please enter a number:"))
 8 
 9     if num_guess == num:
10 
11         print("yes,you got it...")
12 
13         flag = False
14 
15     elif num_guess > num:
16 
17         print ("Is bigger")
18 
19     else:
20 
21         print("Is smaller")
22 
23   times -=1

break和continue:

break的作用是退出整个循环,continue的作用是退出本次循环执行下一次循环。

 1 num = 1
 2 
 3 while num <= 10:
 4 
 5     num +=1
 6 
 7     if num ==5:
 8 
 9         break
10 
11     print(num,end=" ")
12 
13 #结果为:2 3 4          #执行到break就退出循环。
 1 num = 1
 2 
 3 while num <= 10:
 4 
 5     num +=1
 6 
 7     if num ==5:
 8 
 9         continue
10 
11     print(num,end=" ")
12 
13 #结果为:2 3 4 6 7 8 9 10 11             #执行到continue终止本次循环,不打印5,继续执行下一次循环。

 

while…else语句:

else在什么情况下才执行:当while是正常执行完毕时,就执行else语句;当while是被强制退出时,就不执行else语句,比如由break导致while循环退出,就不会执行else语句。

while循环嵌套:

关键是找出控制内层循环和控制外层循环的关系。

输出5行5列星号

*****

*****

*****

*****

*****

加法:

 1 num1 = 1
 2 
 3 while num1 <= 5:
 4 
 5     num2 = 1
 6 
 7     while num2 <= 5:
 8 
 9         print("*",end = "")
10 
11         num2 += 1
12 
13     print()
14 
15     num1 += 1

减法:

 1 num1 = 5
 2 
 3 while num1 > 0:
 4 
 5     num2 = 5
 6 
 7     while num2 > 0:
 8 
 9         print("*",end = "")
10 
11         num2 -= 1
12 
13     print()
14 
15     num1 -= 1

示例4:

第一行1个星号,第二行2个星号,以此类推

*

**

***

****

*****

加法:

 1 num1 = 1
 2 
 3 while num1 <= 5:
 4 
 5     num2 = 1
 6 
 7     while num2 <= num1:  #从外层向内层思考
 8 
 9         print("*",end = "")
10 
11         num2+=1
12 
13     print()
14 
15     num1 += 1

减法:

 1 num1 = 5
 2 
 3 while num1 > 0:
 4 
 5     num2 = 5
 6 
 7     while num2 >= num1:  #从外向内思考
 8 
 9         print("*",end = "")
10 
11         num2 -= 1
12 
13     print()
14 
15     num1 -= 1

示例5

第一行5个星号,第二行4个星号,以此类推

*****

****

***

**

*

加法:

 1 num1 = 1
 2 
 3 while num1 <= 5:
 4 
 5     num2 = 1
 6 
 7     while num2 <= 6 - num1:  #从外向内思考
 8 
 9         print("*",end = "")
10 
11         num2 += 1
12 
13     print()
14 
15     num1 += 1

减法:

 1 num1 = 5
 2 
 3 while num1 > 0:
 4 
 5     num2 = 5
 6 
 7     while num2 >=6 - num1:  #从外向内思考
 8 
 9         print("*",end = "")
10 
11         num2 -= 1
12 
13     print()
14 
15   num1 -= 1

从上面的几个示例中,我们发现,无论是加法还是减法,num1和num2的关系不变,都是num2和6-num1之间的大小关系。

示例6

*

***

*****

*******

*********

 1 num1=1  #第一行一个星号,第二行三个星号,以此类推
 2 
 3 while num1<=5:  #从外向内思考
 4 
 5     num2=1
 6 
 7     while num2<=5-num1:    #通过减数能够控制左边的空格数,5-5=0个空格,10-5=5个空格
 8 
 9         print(" ",end="")
10 
11         num2+=1
12 
13     num2=1
14 
15     while num2<=num1*2-1:  #外层循环1次,内层循环2次
16 
17         print("*",end="")
18 
19         num2+=1
20 
21     print()
22 
23   num1+=1

示例7

      *

    ***

  *****

 *******

*********

 1 num1=1  #第一行一个星号,第二行三个星号,以此类推
 2 num3=int(input("please enter the row:"))
 3 while num1<=num3:  #从外向内思考
 4     num2=1
 5     while num2<=num3-num1:    #通过减数能够控制左边的空格数,5-5=0个空格,10-5=5个空格
 6         print(" ",end="")
 7         num2+=1
 8     num2=1
 9     while num2<=num1*2-1:  #外层循环1次,内层循环2次
10         print("*",end="")
11         num2+=1
12     print()
13   num1+=1
原文地址:https://www.cnblogs.com/yangxiaoling/p/5795242.html