计算机技术演进
1946 - 1981 计算机系统结构时代    计算能力
1981 - 2008 个人pc计算机时代        交互问题  视窗、网络
2008 - 2016 复杂信息系统时代         数据问题
2017 -              人工智能时代             人类的问题
新计算时代
 
不同编程语言的初心和适用对象
C   理解计算机系统结构   关注性能   底层
JAVA  理解主客体关系    跨平台    软件类
C++   理解主客体关系   大规模程序     核心软件
VB   理解交互逻辑    桌面应用
Python     理解问题求解    各类问题
python  是一个通用语言
 
 
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 ) turrle.circle(40 ,80 /2 ) turtle.fd(40 ) turtle.circle(16 ,180 ) turtle.fd(40 *2 /3 ) turtle.done() 
举一反三
Python语法元素理解
程序参数的改变  颜色  长度 方向
 
 
turtle.setup(width,height,startx,starty) 示例: >>>  import  turtle>>>  turtle.setup(800 ,400 ,0 ,0 )  >>>  import  turtle>>>  turtle.setup(800 ,400 )   
turtle空间坐标体系
绝对坐标  以海龟在中心为原点,做平面坐标系
 
 
import  turtleturtle.goto(100 ,100 ) turtle.goto(100 ,-100 ) turtle.goto(-100 ,-100 ) turtle.goto(-100 ,100 ) turtle.goto(0 ,0 ) 
	海龟坐标  
turtle.fd(d)  turtle.bk(d)  turtle.circle(r,angle)   r 半径  angle 角度 
import  turtleturtle.circle(100 ,1 ) turtle.circle(250 ,80 ) turtle.circle(150 ,45 ) turtle.circle(120 ,45 ) turtle.circle(150 ,30 ) turtle.circle(150 ,30 ) turtle.circle(130 ,10 ) turtle.circle(130 ,5 ) turtle.circle(130 ,5 ) turtle.circle(15 ,50 ) turtle.circle(15 ,170 ) turtle.circle(130 ,5 ) turtle.circle(130 ,5 ) turtle.circle(130 ,10 ) turtle.circle(150 ,30 ) turtle.circle(150 ,30 ) turtle.circle(120 ,45 ) turtle.circle(150 ,45 ) turtle.circle(250 ,80 ) turtle.circle(100 ,10 ) turtle.circle(100 ,1 ) 
	绝对角度坐标体系,x轴为0度
turtle.seth(angle)    turtle.left(angle)    turtle.right(angle)   
RGB色彩体系
红黄蓝三通道
RGB小数值、整数值
 
 
turtle.colormode(mode)  1.0   表示小数值模式255   表示整数值模式
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 ) turrle.circle(40 ,80 /2 ) turtle.fd(40 ) turtle.circle(16 ,180 ) turtle.fd(40 *2 /3 ) turtle.done() 
turtle.的编程风格
扩充Python程序功能的方式
使用import保留字完成,采用.()编码风格
import <库名>
import <库名> <库名> . <函数名>(<函数参数>) 
使用from和import保留字共同完成
from  <库名> import  <函数名>from  <库名> import *<函数名>(函数参数) 
使用上述方式可以不用turtle. 直接函数名加函数参数,如下
from  turtle import *           setup(650 ,350 ,200 ,200 ) penup() fd(-250 ) pendown() pensize(25 ) pencolor("purple" ) seth(-40 ) for  i in  range (4 ):    circle(40 ,80 )     circle(-40 ,80 )     circle(40 ,80 /2 ) fd(40 ) circle(16 ,180 ) fd(40 *2 /3 ) done() 
<库名> . <函数名>(<函数参数>)
<函数名>(函数参数)
第一种方法不会出现函数重名问题
第二种方法会出现
使用import和as保留字共同完成
import  <库名> as  <库别名>   <库别名> . <函数名>(<函数参数>)  
turtle.penup()       turtle.pendown()     turtle.pensize(25 )   turtle.pencolor("purple" )   颜色字符串   turtle.pencolor("purple" ) RGB的小数值  turtle.pencolor(0.62 ,0.42 ,0.13 ) RGB的元组值  turtle.pencolor((0.62 ,0.42 ,0.13 )) 
将海龟想象为画笔
画笔操作后一直有效,一般成对出现
turtle运动控制函数
控制海龟行进方向:走直线或者曲线
turtle.forward(d)  别名  turtle.fd(d) d :行进距离,可以为负数,倒退行进 turtle.circle(r,extent=None )   r:默认圆心在海龟左侧r距离的位置 extent :绘制角度,默认是360 度整圆 
turtle方向控制函数
控制海龟面对方向:绝对角度和海龟角度
turtle.setheading(angle)   别名  turtle.seth(angle) angle:改变行进绝对方向,海龟走角度 turtle.left(angle) turtle.right(angle) angle: 在海归当前行进方向上旋转的角度 
循环语句
for <执行次数> in  range (<要执行多少次>):   <被循环执行的语句>      示例: for  i in  range (5 ):    print (i) 输出: 0 1 2 3 4 
range函数
range (N)  即产生0 到N-1 的整数序列,共N个如:range (5 ),则产生0 ,1 ,2 ,3 ,4  range (M,N) 即产生M到N-1 的整数序列,共N-M个如:range (2 ,5 ),则产生2 ,3 ,4  
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 )        turrle.circle(40 ,80 /2 )           turtle.fd(40 )                    turtle.circle(16 ,180 )            turtle.fd(40 *2 /3 )                turtle.done()                    
与数学整数概念一致
pow(x,y)  计算x的y次方,想算多大算多大 
四种进制表示:
十进制:1010、99、-217
二进制:0b或0B开头  :  0b0101,-0B1010
八进制:以0o或0O开头: 0o123,0O456
十六进制:以0x或0X开头:0x9a,- 0X89
与数学实数概念一致
浮点数取值范围和小鼠精度都存在限制
取值范围数量级约±10的308次方,精度数量约10的-16
浮点数之间的运算存在不确定尾数,不是bug
>>>  0.1  +0.2 0.30000000000000004 
round (x,d): 对x四舍五入,d是小数截取位数     示例: >>>  round (0.1  + 0.2 ,1 ) == 0.3 True 
格式e表示 a*10的b次方
例如:4.3e-3  值为0.0043
复数类型 x的平方 = -1 ,那么x的值是?
定义 :j = ( − 1 ) j=\sqrt{(-1)} j = ( − 1 )  
a + bj 被称为复数,其中a为实部,b是虚部
>>>  z = 10  + 10j    >>>  print (z)(10 +10j ) >>>  a = 10 >>>  print (a)10 
x / y       x // y      示例: >>>  3  // 4 0 >>>  7 /2 3.5 >>>  7 //2 3 >>>  19  / 5 3.8 >>>  19 //5 3 
x ** y   示例: >>>  2  ** 10 1024 >>>  49  ** 0.5 7.0 
不同数据类型间可以混合运算,生成结果为“最宽”类型
注意可能会产生不确定的尾数
函数及使用 
描述 
 
 
abs(x) 
绝对值,x的绝对值 
 
divmod(x,y) 
商余,(x//y,x%y),同时输出商和余数 
 
pow(x,y,z) 
幂余运算,(x**y)%z,参数z可省略 
 
round(x,d) 
四舍五入,d是保留小数位数,默认为零 
 
max(a,b,c,…) 
返回数字序列中最大值 
 
min(a,b,c,…) 
返回数字序列最小值 
 
 
>>>  abs (-1 )1 >>>  divmod (10 ,3 )(3 , 1 ) >>>  pow (2 ,10 ,10 )4 >>>  pow (2 ,10 )1024 >>>  round (10.12345 ,4 )10.1235  >>>  max (1 ,9 ,5 ,2 ,6 )9 >>>  min (3 ,2 ,4 ,5 ,1 ,23 )1 
函数及使用 
描述 
 
 
int(x) 
转变为整型,取整数部分 
 
float(x) 
转变为浮点数,增加小数部分 
 
complex(x) 
将x变成复数,增加虚数部分 
 
 
>>>  int (4.35 )4 >>>  float (1.23 )1.23 >>>  float (1 )1.0 >>>  complex (5 )(5 +0j ) 
基本问题,持续价值
1.01的365次方
0.99的365次方
1.001的365次方
0.999的365次方
x = pow (1.001 ,365 ) y = pow (0.999 ,365 ) print ("向上:{:.2f},向下:{:.2f}" .format (x,y))输出: 向上:1.44 ,向下:0.69  
dayfactor = 0.005    dayup = pow (1  + dayfactor,365 ) daydown = pow (1  - dayfactor,365 ) print ("向上:{:.2f},向下:{:.2f}" .format (dayup,daydown))输出: 向上:6.17 ,向下:0.16  dayfactor = 0.01  dayup = pow (1  + dayfactor,365 ) daydown = pow (1  - dayfactor,365 ) print ("向上:{:.2f},向下:{:.2f}" .format (dayup,daydown))输出: 向上:37.78 ,向下:0.03  
一周  5天工作日每天提升1%,休息日2天每天退步1%
dayup = 1.0  dayfactor = 0.01  for  i in  range (365 ):    if  i % 7  in  [6 ,0 ]:         dayup = dayup *(1 -dayfactor)     else :         dayup = dayup *(1 +dayfactor) print ("一年后的成长:{:.2f}倍" .format (dayup))输出: 一年后的成长:4.63 倍 
结论:问题3的结果4.63倍介于,问题1的365天每天千分之一的1.44倍和问题2的365每天千分之五6.17倍之间。
A  每天1%
B  工作日提升x,休息日下降1%
问当x为多少时,A与B的提升相等?
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  
结论:工作日要努力约2%,才能跟不休息每天学1%的人相同
由一对 ‘  ’ 或 ” “ 包含的一连串字符
可以索引”  “[ ]
前两种 "请输如带有符号的温度值"   或者   'C' 后两种 ''' Python              语言 '''   或者 """ Python              语言  """ 
如果要在字符串内部表示 “ 则用 ‘ 构成字符串
如果要在字符串内部表示 ’ 则用 “ 构成字符串
如果 ‘ 和 ” 都要在字符串内部表示,则用  ’‘’  构成字符串
切片高级用法
<字符串>[M:N] ,M缺失变送至开头,缺失表示至结尾
<字符串>[M:N:K],使用[M:N:K]根据步长对字符串切片,k表示每移几位进行切片
>>>  "123456789" [1 :7 :2 ]   '246' >>>  "123456789" [::-1 ]  '987654321' 更多测试 >>>  "123456789" [2 ::-1 ]'321' >>>  "123456789" [0 ::-1 ]'1' >>>  "123456789" [:5 :-1 ]'987' 
转义符表达特定字符的本意
>>>"这里有个双引号\"  "  '这里有个双引号"  ' \b 回退  \n换行  \r回车 
操作符及使用 
描述 
 
 
x + y 
连接两个字符串x和y 
 
n *x 
复制n次字符串x 
 
x in s 
如果x是s的子串,返回true,否则返回False 
 
 
weekStr = "星期一星期二星期三星期四星期五星期六星期日"  weekID = eval (input ("请输入星期数字(1-7):" )) pos = (weekId - 1 ) * 3  print (weekStr[pos:pos+3 ])改进版 weekStr = "一二三四五六日"  weekID = eval (input ("请输入星期数字(1-7):" )) print ("星期" +weekStr[weekID])
函数及使用 
描述 
 
 
len(x) 
返回字符串的长度 
 
str(x) 
返回任意类型x对应的字符串形式,与eval()相对应 
 
hen(x) 或oct(x) 
整数x的十六进制或八进制小写形式字符串 
 
chr(u) 
u为Unicode编码,返回其对应的字符 
 
ord(x) 
x为字符,返回其对应的Unicode编码 
 
 
python字符串的编码方式,适用于各国语言
从0到1114111(0x10FFFF)空间,每个编码对应一个字符
>>>  "1 + 1 = 2 "  + chr (10004 )'1 + 1 = 2 ✔' >>>  chr (9801 )'♉' >>>  str (ord ("♉" ))'9801' 
>>>  for  i in  range (12 ):	print (chr (9800  +i))    	 ♈ ♉ ♊ ♋ ♌ ♍ ♎ ♏ ♐ ♑ ♒ ♓ >>>  for  i in  range (12 ):	print (chr (9800  +i), end = "" )   	 ♈♉♊♋♌♍♎♏♐♑♒♓ 
“方法”在编程中是专有名词
方法特指  a . b( ) 风格中的函数b( )
方法本身也是函数,但与a有关,b是a提供的函数
面向对象中
a为对象,b为对象能够提供的功能
方法必用 . 的方式执行
 
 
方法及使用 
描述 
 
 
str . lower()或str.upper() 
返回字符串的副本,全部字符小写/大写 
 
str . split(sep) 
返回一个列表,由str根据sep被分隔的部分组成 
 
str . count(sub) 
返回子串sub在str中出现的次数 
 
str.replace(old,new) 
返回字符串str副本,所有old子串被替换为new 
 
str.center(width[,fillchar]) 
字符串str根据宽度with居中,fillchar可选,宽度是新的整个字符串的宽度 
 
str.strip(chars) 
从str中去掉在其左侧和右侧chars中列出的字符 
 
str.join(iter) 
在iter变量除最后元素外每个元素后增加一个str 
 
 
>>>  "abcdefg" .upper()'ABCDEFG' >>>  "a,b,c,d,e,f,g" .split("," )     ['a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g' ] >>>  "an apple is bad" .count("a" )3 >>>  "abcdefg" .split("c" )  ['ab' , 'defg' ] >>>  "python" .replace("n" ,"n123.io" )'python123.io' >>>  "an" .center(10 ,"=" )'====an====' >>>  "=python =" .strip(" =np" )'ytho' >>>  "," .join("12345" )'1,2,3,4,5' 
格式化是对字符串进行格式表达的方式
<模板字符串>.format (<逗号分隔的参数>) 
一对 { } 表示槽
不同的对应位置有不同的输出
示例: “{}:计算机{}的CPU占用率为{}%”.format ("2018-10-10" ,"C" ,10 )   “{0 }:计算机{1 }的CPU占用率为{2 }%”.format ("2018-10-10" ,"C" ,10 )        >>>  print ("{0}:计算机{1}的CPU占用率为{2}%" .format ("2018-10-10" ,"C" ,10 ))2018 -10 -10 :计算机C的CPU占用率为10 %     >>>  print ("{1}:计算机{0}的CPU占用率为{2}%" .format ("2018-10-10" ,"C" ,10 )) C:计算机2018 -10 -10 的CPU占用率为10 %      >>>  print ("{}:计算机{}的CPU占用率为{}%" .format ("2018-10-10" ,"C" ,10 ))  2018 -10 -10 :计算机C的CPU占用率为10 %
类似于C输出的格式控制
: 
<填充> 
<对齐> 
<宽度> 
<,> 
< . 精度> 
<类型> 
 
 
引导符号 
用于填充的单个字符 
< 左对齐 ,> 右对齐,^ 居中对齐 
槽设定的输出宽度 
数字的千位分隔符 
浮点数小数精度或字符串最大输出长度 
整数类型b,c,d,o,x,X浮点数类型e,E,f,% 
 
 
示例: >>>  "{0:=^20}" .format ("PYTHON" )'=======PYTHON=======' >>>  "{1:=^20}" .format ("PYTHON" ,"ABC" )'========ABC=========' >>>  "{1:=<20}" .format ("PYTHON" ,"ABC" )'ABC=================' >>>  "{1:20}" .format ("PYTHON" ,"ABC" )'ABC                 '              >>>  "{0:,.2f}" .format (1234567.8910 )'1,234,567.89' >>>  "{0:b},{0:c},{0:d},{0:o},{0:x},{0:X}" .format (425 )   '110101001,Ʃ,425,651,1a9,1A9' >>>  "{0:e},{0:E},{0:f},{0:%}" .format (3.14 )'3.140000e+00,3.140000E+00,3.140000,314.000000%' 
中文可以放到字符串中,不能在语法中出现 
python中的标准库
计算机时间的表达
提供获取系统时间并格式化输出功能
提供系统级精确计时功能没用于程序性能分析
函数 
描述 
 
 
time() 
获取当前时间戳,即计算机内部时间值 
 
ctime() 
获取当前时间,格式是,星期、‘月、日、时间、年份’ 
 
gmtime() 
获取当前时间,表示为计算机程序可编程利用的时间格式 
 
 
>>>  time.time()1610244498.6032174    >>>  time.ctime()'Sun Jan 10 10:11:36 2021' >>>  time.gmtime()time.struct_time(tm_year=2021 , tm_mon=1 , tm_mday=10 , tm_hour=2 , tm_min=29 , tm_sec=12 , tm_wday=6 , tm_yday=10 , tm_isdst=0 ) 
类似字符串格式化,需要展示模板
函数 
描述 
 
 
strftime(tpl,ts) 
tpl是格式化模板字符串,用来定义输出效果,ts是计算机内部时间类型变量 
 
%Y 
年份 0000~9999 
 
%m 
月份 01~12 
 
%B 
月份名称 January ~December 
 
%b 
月份名称缩写 Jan ~ Dec 
 
%d 
日期 01~31 
 
%A 
星期 Monday ~ Sunday 
 
%a 
星期缩写 Mon ~ Sun 
 
%H 
小时  00 ~ 23 
 
%I 
小时  01 ~ 12 
 
%p 
上下午  AM,PM 
 
%M 
分钟  00 ~ 59 
 
%S 
秒钟  00 ~ 59 
 
strptime(str,tpl) 
str是字符串形式的时间值,tpl是格式化模板字符串,用来定义输入效果 
 
 
>>>  time.strftime("%Y-%m-%d %H:%M:%S" ,t)'2021-01-10 02:37:19' >>>  time.strptime('2021-01-10 02:37:19' ,"%Y-%m-%d %H:%M:%S" )time.struct_time(tm_year=2021 , tm_mon=1 , tm_mday=10 , tm_hour=2 , tm_min=37 , tm_sec=19 , tm_wday=6 , tm_yday=10 , tm_isdst=-1 ) 
测量起止动作所经历的时间
测量时间函数:perf_counter()
产生时间函数:sleep()
函数 
描述 
 
 
perf_counter() 
返回一个CPU级别的精确时间计数值,单位为秒。由于这个计数值起点不确定,连续调用差值才有意义 
 
sleep(s) 
s 拟休眠时间,单位是秒,可以是浮点数 
 
 
示例:
import  time>>>  start = time.perf_counter()>>>  end = time.perf_counter()>>>  end - start21.654742400000032 >>>  def  wait ():    time.sleep(3.3 )      >>>  wait()             
采用字符串方式打印可以动态变化的文本进度条
进度条需要能在一行中逐渐变化
采用sleep()模拟一个持续进度
####初步结构
import  timescale = 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 ("------执行结束------" )    输出 
刷新的本质是:用后打印的字符覆盖之前的字符
不能换行:print()需要被控制
要能回退:打印后光标退回到之前的位置\r
import  timefor  i in  range (101 ):    print ("\r{:3}%" .format (i),end="" )     time.sleep(0.1 )      输出: IDLE输出会将每一个结果输出,用cmd命令提示符运行即可看到效果 
import  timescale = 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 ,'-' ))    time.sleep(1 ) 输出: cmd输出 
比较不同排序方法的时间
进图条扩展
在任何运行时间需要较长的程序中增加进度条
在任何希望提高用户体验的应用中增加进度条
进度条是人机交互的纽带之一
结论:开始慢,后来速度随着进度增加的函数更符合人的心理期望