小编想使用python快速筛选文献、股票信息提取、写批处理脚本等,最近学习了股票信息提取,发现半年前学的基础知识已经忘完了,而且还没有笔记查询。本文参考MOOC·嵩天老师团队·北京理工大学:《Python语言程序设计》的课件,完整地整理了一遍。码字不易,希望转载本文时,注明出处。
在本科期间,大多数人奉行“不挂科”主义,上课效率不是很高,基础知识不牢固,导致需要用编程知识的时候只能重新去查找学习,说的就是小编!(小编读本科时,没有开设python这门课)
还有就是对于Python语言,肯定会有大批的本科学生去学习,希望本文对读者有积极的作用。
学习python的基本要求:
方法论
实践能力
计算机是根据指令操作数据的设备
计算机发展历史上最重要的预测法则,目前面临着失效的风险
计算机发展参照摩尔定律,表现为指数形式
程序设计是计算机可编程性的体现
程序设计语言是一种用于交互(交流)的人造语言
编程语言种类很多,但生命力强劲的却不多
计算机执行源程序两种方式:编译和解释
将源代码一次性转换成目标代码的过程。
执行编译过程的程序叫编译器(compiler)。
将原代码逐条转换成目标代码同时逐条运行的过程。
执行解释过程的程序叫解释器(interpreter)。
根据执行方式不同,编程语言分为两类
执行方式不同,优势各有不同
程序的基本编写方法
输入
输出
处理
一个待解决问题中,可以用程序辅助完成的部分
Q:为什么要学习计算机编程?
A:因为“编程是件很有趣的事儿”!
能够训练思维
编程能够增进认识
编程能够带来乐趣
编程能够提高效率
编程带来就业机会
Q:编程很难学吗? A:掌握方法就很容易!
程序设计基本方法
Python语言创立者:Guido van Rossum
2002年,Python 2.x
2008年,Python 3.x(现在都在学这个)
Python官方提供 适用于小规模程序开发
Python官方环境:Python解释器 + IDLE开发环境
轻量级:只有几十MB大小,使用灵活
功能丰富:编辑器+交互环境+标准库+库安装工具…
下载地址: www.python.org/downloads
或者: www.python123.io/downloads(推荐这个网址,下载速度快)
具体配置方法,去MOOC查看课程,或者点击此处调转B站查看
交互式和文件式
实例1: 圆面积的计算
根据半径r计算圆面积
交互式
>>> r = 25
>>> area = 3.1415 * r * r
>>> print(area)
1963.4375000000002
>>> print(" {:.2f}".format(area))
1963.44
文件式
#保存为CalCircle.py文件并运行
r = 25
area = 3.1415 * r * r
print(area)
print(" {:.2f}".format(area))
输出结果如下:
1963.4375000000002
1963.44
实例2:同切圆绘制
绘制多个同切圆
交互式
>>> import turtle
>>> turtle.pensize(2)
>>> turtle.circle(10)
>>> turtle.circle(40)
>>> turtle.circle(80)
>>> turtle.circle(100)
文件式
#保存为TangentCirclesDraw.py文件并运行
import turtle
turtle.pensize(2)
turtle.circle(10)
turtle.circle(40)
turtle.circle(80)
turtle.circle(100)
输出结果如下:
实例3: 五角星绘制
绘制一个五角星
交互式
>>> from turtle import *
>>> color('red', 'red')
>>> begin_fill()
>>> for i in range(5):
fd(200)
rt(144)
>>> end_fill()
>>>
文件式
#保存为StarDraw.py文件并运行
from turtle import *
color('red', 'red')
begin_fill()
for i in range(5):
fd(200)
rt(144)
end_fill()
done()
VSCode:Visual Studio Code
第一步:安装IDLE环境;第二步:安装VSCode
Python开发环境配置
题目本身简单,但学会这种思维,其他常见的"转换"问题解决方法同理。
温度刻画的两种不同体系
两种温度体系的转换
该问题中计算部分的理解和确定
分析问题
划分边界
输入输出格式设计
标识放在温度最后,F表示华氏度,C表示摄氏度
82F表示华氏82度,28C表示摄氏28度
设计算法
根据华氏和摄氏温度定义,利用转换公式如下:
C = ( F – 32 ) / 1.8
F = C * 1.8 + 32
其中, C表示摄氏温度, F表示华氏温度
#TempConvert.py
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("输入格式错误")
Python语法元素理解
输入输出的改变
计算问题的扩展
代码高亮:编程的色彩辅助体系,不是语法要求
缩进:一行代码开始前的空白区域,表达程序的格式框架,表达代码间包含关系的唯一手段
缩进表达程序的格式框架
注释:用于提高代码可读性的辅助文字,不被执行。
变量
用来保存和表示数据的占位符号,变量采用标识符(名字)来表示。
命名
用来保存和表示数据的占位符号
保留字
被编程语言内部定义并保留使用的标识符
数据类型:字符串、整数、浮点数、列表
由0个或多个字符组成的"有序"字符序列
使用[ ]获取字符串中一个或多个字符
由整数和浮点数都是数字类型
整数:数学中的整数
浮点数:数学中的实数,带有小数部分
由0个或多个数据组成的"有序"序列
赋值语句:由赋值符号构成的一行代码
分支语句:由判断条件决定程序运行方向的语句
函数:根据输入参数产生不同输出的功能过程
从控制台获得用户输入的函数
以字符形式向控制台输出结果的函数
注:input()和print(),在控制台显示的时候,一个添加引号形成字符串,一个将字符串自动去掉引号。
补充:"eval()"去掉参数最外侧引号并执行余下语句的函数
去掉参数最外侧引号并执行余下语句的函数
>>> eval("1")
1
>>> eval("1+2")
3
>>> eval('"1+2"')
'1+2'
>>> eval('print("Hello")')
Hello
Python程序语法元素分析
方法论
实践能力
年份 | 演进过程 | 解决问题 |
---|---|---|
1946-1981 | 计算机系统结构时代(35年) | 计算能力问题 |
1981-2008 | 网络和视窗时代(27年) | 交互问题 |
2008-2016 | 复杂信息系统时代(8年) | 数据问题 |
2016- 未知 | 人工智能时代 | 人类的问题 |
编程语言有哪些?
Basic, C, C++, C#, CSS, Fortran, Go, HTML, Java,
JavaScript, Lisp, Lua, Matlab, Object C, Pascal, Perl, PHP,
PostScript, Python, Ruby, Scala, SQL, Swift, VBA,
VB.NET, Verilog, VHDL, Visual Basic
编程语言,也是一个江湖!
不同编程语言的初心和适用对象
编程语言 | 学习内容 | 语言本质 | 解决问题 | 适用对象 |
---|---|---|---|---|
C | 指针、内存、数据类型 | 理解计算机系统结构 | 性能 | 计算机类专业 |
Java | 对象、跨平台、运行时 | 理解主客体关系 | 跨平台 | 软件类专业 |
C++ | 对象、多态、继承 | 理解主客体关系 | 大规模程序 | 计算机类专业 |
VB | 对象、按钮、文本框 | 理解交互逻辑 | 桌面应用 | 不确定 |
Python | 编程逻辑、第三方库 | 理解问题求解 | 各类问题 | 所有专业 |
各编程语言所处历史时期和使命不同,Python是计算时代演进的选择!
通用语言
脚本语言
开源语言
跨平台语言
多模型语言
如何看待Python语言?
人生苦短,我学python
工具决定思维:关注工具变革的力量!
机器语言 --> 代码直接执行,与CPU有关
汇编语言 --> 助记符,汇编器,与CPU有关
高级语言 --> 编译器,与CPU无关
超级语言 --> 整合已有程序,庞大计算生态
python是唯一的超级语言!
深入理解Python语言
Python蟒蛇绘制
用程序绘制一条蟒蛇
-问题1: 计算机绘图是什么原理?
一段程序为何能够产生窗体?为何能在窗体上绘制图形?
-问题2: Python蟒蛇绘制从哪里开始呢?
如何绘制一条线?如何绘制一个弧形?如何绘制一个蟒蛇?
#PythonDraw.py
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()
import turtle 导入海归绘图库
Python语法元素理解
程序参数的改变
计算问题的扩展
Python蟒蛇绘制问题是各类图形绘制问题的代表
turtle(海龟)库是turtle绘图体系的Python实现
Python计算生态 = 标准库 + 第三方库
turtle(海龟)是一种真实的存在
由三种颜色构成的万物色
英文名称 | RGB整数值 | RGB小数值 | 中文名称 |
---|---|---|---|
white | 255, 255, 255 | 1, 1, 1 | 白色 |
yellow | 255, 255, 0 | 1, 1, 0 | 黄色 |
magenta | 255, 0, 255 | 1, 0, 1 | 洋红 |
cyan | 0, 255, 255 | 0, 1, 1 | 青色 |
blue | 0, 0, 255 0, | 0, 1 | 蓝色 |
black | 0, 0, 0 | 0, 0, 0 | 黑色 |
seashell | 255, 245, 238 | 1, 0.96,0.93 | 海贝色 |
gold | 255, 215, 0 | 1, 0.84, 0 | 金色 |
pink | 255, 192, 203 | 1, 0.75, 0.80 | 粉红色 |
brown | 165, 42, 42 | 0.65, 0.16, 0.16 | 棕色 |
purple | 160, 32, 240 | 0.63, 0.13, 0.94 | 紫色 |
tomato | 255, 99, 71 | 1, 0.39, 0.28 | 番茄色 |
查看更多颜色,请点击链接:https://www.sioe.cn/yingyong/yanse-rgb-16/
注意:这个表格的颜色,使用了Markdown的颜色模式,也不算是Markdown独有的,其实是网页的XXX。本来不想整理这个的,但是看到这些颜色可以使自己更熟练使用Markdown调色模式
如:
前文一直用的这个颜色
但是,这么多色号,哪记得住呀,可以直接使用英文名称
我是蓝色
我是粉红色
我是棕色
我是紫色
我是青色
__我是青色加粗__
······
上面这个框最终显示效果如下:
前文一直用的这个颜色
但是,这么多色号,哪记得住呀,下面是直接使用英文名称产生的效果
我是蓝色
我是粉红色
我是棕色
我是紫色
我是青色
我是青色加粗
···
–RGB指 红 蓝 绿 组合
–RGB整数值,小数值
–turtle.colormode(mode),默认小数值
扩充Python程序功能的方式
使用from和import保留字共同完成
from <库名> import <函数名>
from <库名> import *
<函数名>(<函数参数>)
penup(),pendown(),pensize(),pencolor()
别名:pu(),pd()
pensize(width) --> 别名:width(width)
pencolor(color) 颜色字符串、rgb值(三个小数值,或 一个元组小数值)
画笔操作后一直有效,一般成对出现
画笔设置后一直有效,直至下次重新设置
pencolor(color)的color可以有三种形式
控制海龟行进:走直线 & 走曲线
画笔设置后一直有效,直至下次重新设置
turtle.forward(d) 别名 turtle.fd(d)
向前行进,海龟走直线
d: 行进距离,可以为负数
turtle.circle(r, extent=None)
根据半径r绘制extent角度的弧形
r: 默认圆心在海龟左侧r距离的位置
extent: 绘制角度,默认是360度整圆
控制海龟面对方向: 绝对角度 & 海龟角度
控制海龟面对方向: 绝对角度 & 海龟角度
按照一定次数循环执行一组语句
for <变量> in range(<次数>):
<被循环执行的语句>
>>> for i in range(5):
print(i)
0
1
2
3
4
>>> for i in range(5):
print("hello:",i)
hello: 0
hello: 1
hello: 2
hello: 3
hello: 4
产生循环计数序列
range(5)
0, 1, 2, 3, 4
range(2, 5)
2, 3, 4
略
turtle程序语法元素分析
方法论
实践能力
与数学中整数的概念一致
整数无限制 pow()
>>> pow(2,100)
1267650600228229401496703205376
>>> pow(2,pow(2,15))
14154610310449547890015530277449516013481307114723881672343857482723666342408452535960253564766484150754758729616561264923898085795447378488819382962508731917439277935449130110501626512779570298469602117832429335212075454134849698568518511412885151632014829953890550974606220986356750033539292242785829356644162625727733081532775143464803133719886126294814835624381789289588677778500721983161748412519555909966720186450936408508036796302203672013838448667914492847375182628131230834390372436784404208971399237782789527703123187783290048945470654890775968353960171536031700503713020147624438727011113795544843097186623068837760104753484414936004919434790412719929201953319830649301061647272414389408776851646589486548861716411244739756262416327501501266553699810212935700660423054824860408831656358628357286370460583524037560857456912394738978919990859763452037046599671574272395358365071336569088152460801391955694610720063015903729548307386443911380160653441311312076042640538974408289046620471832343775474272876919417415359465108829909044778631854737985283880604575689279436339239288726819275020295729631308408548537399370768810356461793830554834338760514020376144247489029690181591865198110515453679671037671828197091354790191316833093307973744081973398315272390407159081122130951267707176060012888988893707108962488623615038692052145369082581969217655930653253928363321425944111346034755093660281456903063506018592952612962633310186822763175677495345710587722355676795569202407891090705212539871310312639022930347443673569325099521888284753623113164452842286404894218092637384236309312430249145878639281347191861041646606053560015919627786463782954136597707826469792362890626164424180715710392825512893488482745228930595617178601940346982418048875312750781096036371604959075799953664196364170289275733916705807968185260742260950143751894385792160716775407660856056041061230366696674346777234726755644589916712684141008010314539177366659472849566748840353066212864651837986938525998033246198651818562444220792336872945085364085210874188739084982027105970804744802498188580114909305185127137988036291016387162785788741452144290261862766022890124845268300766473568287648783277267198164286789042079444568943931859830903470451768867323262539122976495244398804037014305667613803599255585227182019542875175873672475107776789346644725486477870483063307708623700155258580054797564714992272449011428057497695641847532119672232262129641656788566048924169849150974229605341223334538769812792435657663917963116051492226283282553330615438775258460294045071288900531894425275446651415135711361871268749146016697503924861005075684420468317806310325405740779442744542280876392417368185051637599103651319906329474629932045852181224319923238642449473943904386563564240374719324844521865456921025034790705999538231651942110196967605752644268028483030318043057335322280501802860341751689188274606260422686582951407069150471890494925789966504940058823370711500048689561934065931848386336940684098239034371444173760391742350110532288468514242179551729029186510036109841084026509293593963056343130470887251130390768119400901098555782859378291642135766128222103479577459473310474825253466025426531768998092788082327965575318321502497692536006679022680296617001496328685419562661195280424865340147787798469817610331550072627301626759545202218873847103870517218292719175922950571695895397063616710820948094058717904686232348959147964643900192591675137718648328690360156455421950084560986150383480284008030058019449571562827463795394702506037554653587862814760860445678937151306359149460853616123727427326380373722876338971183032500363558977582095690102460515634291092558649382455245502005802182743148097380750227756512203741052272159062052927519186670604753285932253677930610704221087338009838555075918064134609645855953163599711792842836047314686685454847613817475916397364534198964493234863970307763977612025904676375054733902222494567240932386825577627818395309382337512819996087113561478356551952366660563556788418898622840146740590529951702207114044450127666422033145923717125948779683432652102327981350232991173181917703651238070867043818097596022601516129968969942941860844756191381214552943895858742377916347012961245501796720594858382564458465305991376624808413443765039892446333450160708871981204214355757262371893121618180215480063895011823934417121420449530722640166767990116246203122464685546543715447173552277401576290867397106758452099921333420351440389610658926533921828756229326700677984339348917095198778507942194914479881601719323310064956202800941494643794501530854062250814718795858940879160921416237523451127510677031664036811623319202917408473889576323110533424261529473240116279222258785399350229746160627748391104890800941749728410681020066456774992937690913628537193009587752220886709097238954148664644007563144702819620342765315125440097261746493999375817397181179824173609859582594684854365867336866597710306776646779054015223600418924819514541353605409174110984122867238306727129106033867481363488780565457461121421111166599857823982756271224494143071407494048840607538637060242810314855386661333328355978175146163317281189821806288236576686680996217998420111580207677727929122987687856145744160193205461967934860186778845507158706080049888299781489669807701368843532269498536545416558370294980170310859436604404660760194794351810454368978453510487884401022686777982571347740816743571953588477612266036530402739854419822213180878158351073175712118412158256064533485210979364135202959982607510407787037403663098719991147174410691828257829962994116230874150089109413032841821315847998162107280342555556879567852878870989419277375991598243985275734231177282528397689191450181179955979462822649465237416911808584411943733870989695301268340149236566278491290621891455728702122259094645309195316340902063711463216637972798057600284952880848481793800539314356041825175166008239367379199159741035911676388988717540184701725892349893970518930285743652888903037802391946225382155322127355552993975428453506293615603471954592867295611682353834289308283788876781975906241103722673387566684148995261384808667471148314146875796916360205860136356755590334886497210622441427879604040569613061760229812428409848254217971503939097138849907080086543275580256190742132707142524315151716389945057201443475021858485281290000556297034226954250472095181775771285113154920596137223667246153439683573329241911780419567531329415963221012504170688139773034980339406137910997201747867738446967340340102691395538782123871085081586228397335936349189756166133682438828083915092448068093378829653387015455046915895176504722395807541895476497900380265067077097630981487465240310138005318908768582273605016761618746619464316479295725559929672985534711526934714524801198976081733367532601244525108153334164093570296332651726142036633264099761531024670833791295881128372807111113464908989478084020624012289631941627116574229984292635792765154140009790537406627338166329815085351285184402580067823922888609038232074368207930418819070937918749176358298548081506408949071276004301852023014573984935331119189941008537537719562934301625660113611631689534621880102318190002136697804478568712485643775845090858887978837475383091818107006150322255630910166894747802534125713386255818179210615493525575883236595626756505635351861447544335565397470983226436095424861205129174637067130590642307629243536179720534925271191926581718513459577007725718419981760362693998890124807450759249804793903493327341027744000081200734615405405710515069710039046234843447620051263459054658938178953779281395965499367201004900133759566058892007675966880659610760034720055858902225946550104301231273516653168626634847859664462637406245648753516407809237030068681074407902716829360433048735796489899785717548988407891844801295704469910295047586163931064875233213125074540368086672100736021442900506196106147381395432856493469863932131024568637936655125336559319417905376190206047306014431812506620196874917115473605971178569772408171100397371533552124547459077871311795786564705675350501927023477396533122905225058716128979904299618575500310336657256479879827518684072947304373195053357824252903244279943083749608066844354164459078171071682983429451829855941112814994724957495016424180427346811585604502413092790638167460670162747954618327746990077744238957486776153958484937656722719572786645463431616091268100282542146596336252239345089316917285840283423566693326354580799571478337895016968357817482348849190935742763303545778419752496038991054071048957875982636306792066277964337540455974091765024388676005370168791699144747548400243119221696473883799528025238470801024392851125657516777263732016884032544667890707135752142561924524490291100405379946274245324036201798800565187212191087713740736381187190732113672955143767085965372942045440999035907543716561786569601702176758321532681645916740045002390737435026480991056245485874935448254792705897424944951812237223296933454686393069905231189956405670425313695771311131590273818080713469916045139064503982194263008992046624354925784856665539744927231738597774854129270160683415155174371151370503727502792785483327991937994001541664428014273100765370201199360734952219747919397598461689420553973573482781780504410244900058938182569586653889712013229316805738460845250163322246468666174908324960849916901715830293526098364909081134646683438299853515905529452843725739782954850979508930724235186059820854871544701550252690258540446464965724484952253430962618963789314828832866575088592288684878441844790875384539741441870048843665612567234047721908475860085439613490711311917089432953376643841845327746615032459102574519235156077115597054781325560401976634149118851436979854648073092970029102505053022877694123374411993604245191607165528908828167963782968816418279814530352072337520635187827784937438277081099134931629321824276272610462801682699580775411226681046337123778561415461031044954789001553027744951601348130711472388167234385748272366634240845253596025356476648415075475872961656126492389808579544737848881938296250873191743927793544913011050162651277957029846960211783242933521207545413484969856851851141288515163201482995389055097460622098635675003353929224278582935664416262572773308153277514346480313371988612629481483562438178928958867777850072198316174841251955590996672018645093640850803679630220367201383844866791449284737518262813123083439037243678440420897139923778278952770312318778329004894547065489077596835396017153603170050371302014762443872701111379554484309718662306883776010475348441493600491943479041271992920195331983064930106164727241438940877685164658948654886171641124473975626241632750150126655369981021293570066042305482486040883165635862835728637046058352403756085745691239473897891999085976345203704659967157427239535836507133656908815246080139195569461072006301590372954830738644391138016065344131131207604264053897440828904662047183234377547427287691941741535946510882990904477863185473798528388060457568927943633923928872681927502029572963130840854853739937076881035646179383055483433876051402037614424748902969018159186519811051545367967103767182819709135479019131683309330797374408197339831527239040715908112213095126770717606001288898889370710896248862361503869205214536908258196921765593065325392836332142594411134603475509366028145690306350601859295261296263331018682276317567749534571058772235567679556920240789109070521253987131031263902293034744367356932509952188828475362311316445284228640489421809263738423630931243024914587863928134719186104164660605356001591962778646378295413659770782646979236289062616442418071571039282551289348848274522893059561717860194034698241804887531275078109603637160495907579995366419636417028927573391670580796818526074226095014375189438579216071677540766085605604106123036669667434677723472675564458991671268414100801031453917736665947284956674884035306621286465183798693852599803324619865181856244422079233687294508536408521087418873908498202710597080474480249818858011490930518512713798803629101638716278578874145214429026186276602289012484526830076647356828764878327726719816428678904207944456894393185983090347045176886732326253912297649524439880403701430566761380359925558522718201954287517587367247510777678934664472548647787048306330770862370015525858005479756471499227244901142805749769564184753211967223226212964165678856604892416984915097422960534122333453876981279243565766391796311605149222628328255333061543877525846029404507128890053189442527544665141513571136187126874914601669750392486100507568442046831780631032540574077944274454228087639241736818505163759910365131990632947462993204585218122431992323864244947394390438656356424037471932484452186545692102503479070599953823165194211019696760575264426802848303031804305733532228050180286034175168918827460626042268658295140706915047189049492578996650494005882337071150004868956193406593184838633694068409823903437144417376039174235011053228846851424217955172902918651003610984108402650929359396305634313047088725113039076811940090109855578285937829164213576612822210347957745947331047482525346602542653176899809278808232796557531832150249769253600667902268029661700149632868541956266119528042486534014778779846981761033155007262730162675954520221887384710387051721829271917592295057169589539706361671082094809405871790468623234895914796464390019259167513771864832869036015645542195008456098615038348028400803005801944957156282746379539470250603755465358786281476086044567893715130635914946085361612372742732638037372287633897118303250036355897758209569010246051563429109255864938245524550200580218274314809738075022775651220374105227215906205292751918667060475328593225367793061070422108733800983855507591806413460964585595316359971179284283604731468668545484761381747591639736453419896449323486397030776397761202590467637505473390222249456724093238682557762781839530938233751281999608711356147835655195236666056355678841889862284014674059052995170220711404445012766642203314592371712594877968343265210232798135023299117318191770365123807086704381809759602260151612996896994294186084475619138121455294389585874237791634701296124550179672059485838256445846530599137662480841344376503989244633345016070887198120421435575726237189312161818021548006389501182393441712142044953072264016676799011624620312246468554654371544717355227740157629086739710675845209992133342035144038961065892653392182875622932670067798433934891709519877850794219491447988160171932331006495620280094149464379450153085406225081471879585894087916092141623752345112751067703166403681162331920291740847388957632311053342426152947324011627922225878539935022974616062774839110489080094174972841068102006645677499293769091362853719300958775222088670909723895414866464400756314470281962034276531512544009726174649399937581739718117982417360985958259468485436586733686659771030677664677905401522360041892481951454135360540917411098412286723830672712910603386748136348878056545746112142111116659985782398275627122449414307140749404884060753863706024281031485538666133332835597817514616331728118982180628823657668668099621799842011158020767772792912298768785614574416019320546196793486018677884550715870608004988829978148966980770136884353226949853654541655837029498017031085943660440466076019479435181045436897845351048788440102268677798257134774081674357195358847761226603653040273985441982221318087815835107317571211841215825606453348521097936413520295998260751040778703740366309871999114717441069182825782996299411623087415008910941303284182131584799816210728034255555687956785287887098941927737599159824398527573423117728252839768919145018117995597946282264946523741691180858441194373387098969530126834014923656627849129062189145572870212225909464530919531634090206371146321663797279805760028495288084848179380053931435604182517516600823936737919915974103591167638898871754018470172589234989397051893028574365288890303780239194622538215532212735555299397542845350629361560347195459286729561168235383428930828378887678197590624110372267338756668414899526138480866747114831414687579691636020586013635675559033488649721062244142787960404056961306176022981242840984825421797150393909713884990708008654327558025619074213270714252431515171638994505720144347502185848528129000055629703422695425047209518177577128511315492059613722366724615343968357332924191178041956753132941596322101250417068813977303498033940613791099720174786773844696734034010269139553878212387108508158622839733593634918975616613368243882808391509244806809337882965338701545504691589517650472239580754189547649790038026506707709763098148746524031013800531890876858227360501676161874661946431647929572555992967298553471152693471452480119897608173336753260124452510815333416409357029633265172614203663326409976153102467083379129588112837280711111346490898947808402062401228963194162711657422998429263579276515414000979053740662733816632981508535128518440258006782392288860903823207436820793041881907093791874917635829854808150640894907127600430185202301457398493533111918994100853753771956293430162566011361163168953462188010231819000213669780447856871248564377584509085888797883747538309181810700615032225563091016689474780253412571338625581817921061549352557588323659562675650563535186144754433556539747098322643609542486120512917463706713059064230762924353617972053492527119192658171851345957700772571841998176036269399889012480745075924980479390349332734102774400008120073461540540571051506971003904623484344762005126345905465893817895377928139596549936720100490013375956605889200767596688065961076003472005585890222594655010430123127351665316862663484785966446263740624564875351640780923703006868107440790271682936043304873579648989978571754898840789184480129570446991029504758616393106487523321312507454036808667210073602144290050619610614738139543285649346986393213102456863793665512533655931941790537619020604730601443181250662019687491711547360597117856977240817110039737153355212454745907787131179578656470567535050192702347739653312290522505871612897990429961857550031033665725647987982751868407294730437319505335782425290324427994308374960806684435416445907817107168298342945182985594111281499472495749501642418042734681158560450241309279063816746067016274795461832774699007774423895748677615395848493765672271957278664546343161609126810028254214659633625223934508931691728584028342356669332635458079957147833789501696835781748234884919093574276330354577841975249603899105407104895787598263630679206627796433754045597409176502438867600537016879169914474754840024311922169647388379952802523847080102439285112565751677726373201688403254466789070713575214256192452449029110040537994627424532403620179880056518721219108771374073638118719073211367295514376708596537294204544099903590754371656178656960170217675832153268164591674004500239073743502648099105624548587493544825479270589742494495181223722329693345468639306990523118995640567042531369577131113159027381808071346991604513906450398219426300899204662435492578485666553974492723173859777485412927016068341515517437115137050372750279278548332799193799400154166442801427310076537020119936073495221974791939759846168942055397357348278178050441024490005893818256958665388971201322931680573846084525016332224646866617490832496084991690171583029352609836490908113464668343829985351590552945284372573978295485097950893072423518605982085487154470155025269025854044646496572448495225343096261896378931482883286657508859228868487844184479087538453974144187004884366561256723404772190847586008543961349071131191708943295337664384184532774661503245910257451923515607711559705478132556040197663414911885143697985464807309297002910250505302287769412337441199360424519160716552890882816796378296881641827981453035207233752063518782778493743827708109913493162932182427627261046280168269958077541122668104633712377856
4种进制表示形式
数字电路中的BODH(拨电话)体现的这四种形式,与这里不一样?
关于Python整数,就需要知道这些。
• 整数无限制 pow()
• 4种进制表示形式
与数学中实数的概念一致
浮点数间运算存在不确定尾数,不是bug
浮点数间运算存在不确定尾数,不是bug
>>> 0.1+0.2 == 0.3
False
>>> round(0.1+0.2,1) == 0.3
True
>>>
浮点数可以采用科学计数法表示
关于Python浮点数,需要知道这些。
• 取值范围和精度基本无限制
• 运算存在不确定尾数 round()
• 科学计数法表示
与数学中复数的概念一致
操作符是完成运算的一种符号体系
操作符及使用 | 描述 |
---|---|
x + y | 加,x与y之和 |
x – y | 减,x与y之差 |
x * y | 乘,x与y之积 |
x / y | 除,x与y之商 10/3结果是3.3333333333333335 |
x // y | 整数除,x与y之整数商 10//3结果是3 |
+ x | x本身 |
- y | x的负值 |
x % y | 余数,模运算 10%3结果是1 |
x ** y | 幂运算,x的y次幂,xy 当y是小数时,开方运算10**0.5结果是 10 \sqrt{10} 10 |
二元操作符有对应的增强赋值操作符
增强操作符及使用 | 描述 |
---|---|
x op= y | 即 x = x op y,其中,op为二元操作符 |
x += y x -= y x *= y x /= y x //= y x %= y x **= y |
|
>>> x = 3.1415 >>> x **= 3 # 与 x = x **3 等价 31.006276662836743 |
这个表格排版参考主要参考https://3nice.cc/2018/10/01/markdowntable
数字类型的关系
类型间可进行混合运算,生成结果为"最宽"类型
一些以函数形式提供的数值运算功能
函数及使用 | 描述 |
---|---|
abs(x) | 绝对值,x的绝对值 abs(-10.01) 结果为 10.01 |
divmod(x,y) | 商余,(x//y, x%y),同时输出商和余数 divmod(10, 3) 结果为 (3, 1) |
pow(x, y[, z]) | 幂余,(x**y)%z,[…]表示参数z可省略 pow(3, pow(3, 99), 10000) 结果为 4587 |
round(x[, d]) | 四舍五入,d是保留小数位数,默认值为0 round(-10.123, 2) 结果为 -10.12 |
max(x1,x2, … ,xn) | 最大值,返回x1,x2, … ,xn中的最大值,n不限 max(1, 9, 5, 4, 3) 结果为 9 |
min(x1,x2, … ,xn) | 最小值,返回x1,x2, … ,xn中的最小值,n不限 min(1, 9, 5, 4, 3) 结果为 1 |
int(x) | 将x变成整数,舍弃小数部分 int(123.45) 结果为123; int(“123”) 结果为123 |
float(x) | 将x变成浮点数,增加小数部分 float(12) 结果为12.0; float(“1.23”) 结果为1.23 |
complex(x) | 将x变成复数,增加虚数部分 complex(4) 结果为 4 + 0j |
数字类型及操作
天天向上的力量
基本问题:持续的价值
天天向上的力量
天天向上的力量
问题1: 1‰的力量
#DayDayUpQ1.py
dayup = pow(1.001, 365)
daydown = pow(0.999, 365)
print("向上:{:.2f},向下:{:.2f}".format(dayup, daydown))
运行结果:
向上:1.44,向下:0.69
1.001365 = 1.44 0.999365 = 0.69
1‰的力量,接近2倍,不可小觑哦
天天向上的力量
问题2: 5‰和1%的力量
#DayDayUpQ2.py
#使用变量的好处:一处修改即可
dayfactor = 0.005
dayup = pow(1+dayfactor, 365)
daydown = pow(1-dayfactor, 365)
print("‰5向上:{:.2f},‰5向下:{:.2f}".format(dayup, daydown))
dayfactor1 = 0.01
dayup = pow(1+dayfactor1, 365)
daydown = pow(1-dayfactor1, 365)
print("%1向上:{:.2f},%1向下:{:.2f}".format(dayup, daydown))
运行结果:
‰5向上:6.17,‰5向下:0.16
%1向上:37.78,%1向下:0.03
天天向上的力量
问题3: 工作日的力量
#DayDayUpQ3.py
#采用循环模拟365天的过程
#抽象 + 自动化
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
1.001365 = 1.44 1.005365 = 6.17 1.01365 = 37.78
尽管工作日提高1%,但总体效果介于1‰和5‰的力量之间
天天向上的力量
问题4: 工作日的努力
#DayDayUpQ4.py
#根据df参数计算工作日力量的函数
#参数不同,这段代码可共用
#def保留字用于定义函数
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保留字判断条件是否成立,条件成立时循环执行
while dayUP(dayfactor) < 37.78:
dayfactor += 0.001
print("工作日的努力参数是:{:.3f} ".format(dayfactor))
运行结果:
工作日的努力参数是:0.019
1.01365 = 37.78 1.019365 = 962.89
工作日模式,每天要努力到1.9%,相当于365模式每天1%的效果!
天天向上的力量
问题的变化和扩展
http://ncre.neea.edu.cn/
由0个或多个字符组成的有序字符序列
字符串有 2类共4种 表示方法
#也经常被认为是多行注释
''' Python
语言 '''
Python语言为何提供 2类共4种 字符串表示方式?
使用[ ]获取字符串中一个或多个字符
使用[M: N: K]根据步长对字符串切片
转义符 \
由0个或多个字符组成的有序字符序列
操作符及使用 | 描述 |
---|---|
x + y | 连接两个字符串x和y |
n * x 或 x * n | 复制n次字符串x |
x in s | 如果x是s的子串,返回True,否则返回False |
获取星期字符串
#WeekNamePrintV1.py
weekStr ="星期一星期二星期三星期四星期五星期六星期日"
weekId = eval(input("请输入星期数字(1-7):"))
pos = (weekId - 1 ) * 3
print(weekStr[pos: pos+3])
#WeekNamePrintV2.py
weekStr = "一二三四五六日"
weekId = eval(input("请输入星期数字(1-7):"))
print("星期" + weekStr[weekId-1])
一些以函数形式提供的字符串处理功能
函数及使用 | 描述 |
---|---|
len(x) | 长度,返回字符串x的长度 len(“一二三456”) 结果为 6 |
str(x) | 任意类型x所对应的字符串形式 str(1.23)结果为"1.23" str([1,2])结果为"[1,2]" |
hex(x) 或 oct(x) | 整数x的十六进制或八进制小写形式字符串 hex(425)结果为"0x1a9" oct(425)结果为"0o651" |
chr(u) | x为Unicode编码,返回其对应的字符 |
ord(x) | x为字符,返回其对应的Unicode编码 |
Python字符串的编码方式
"方法"在编程中是一个专有名词
一些以方法形式提供的字符串处理功能
方法及使用 | 描述 |
---|---|
str.lower() 或 str.upper() | 返回字符串的副本,全部字符小写/大写 "AbCdEfGh".lower() 结果为 “abcdefgh” |
str.split(sep=None) | 返回一个列表,由str根据sep被分隔的部分组成 "A,B,C".split(",") 结果为 [‘A’,‘B’,‘C’] |
str.count(sub) | 返回子串sub在str中出现的次数 "an apple a day".count(“a”) 结果为 4 |
str.replace(old, new) | 返回字符串str副本,所有old子串被替换为new "python".replace(“n”,“n123.io”) 结果为"python123.io" |
str.center(width[,fillchar]) | 字符串str根据宽度width居中,fillchar可选 "python".center(20,"=") 结果为’=======python=======’ |
str.strip(chars) | 从str中去掉在其左侧和右侧chars中列出的字符 "= python= “.strip(” =np") 结果为"ytho" |
str.join(iter) | 在iter变量除最后元素外每个元素后增加一个str ",".join(“12345”) 结果为"1,2,3,4,5" #主要用于字符串分隔等 |
格式化是对字符串进行格式表达的方式
>>>"{0:=^20}".format("PYTHON")
'=======PYTHON======='
>>>"{0:*>20}".format("BIT")
'*****************BIT'
>>>"{:10}".format("BIT")
'BIT '
>>>"{0:,.2f}".format(12345.6789)
'12,345.68'
>>>"{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%'
字符串类型及操作
time库是Python中处理时间的标准库
import time
time.<b>()
time库包括三类函数
函数 | 描述 |
---|---|
time() | 获取当前时间戳,即计算机内部时间值,浮点数 |
ctime() | 获取当前时间并以易读方式表示,返回字符串 |
gmtime() | 获取当前时间,表示为计算机可处理的时间格式 |
#获取当前时间戳,即计算机内部时间值,浮点数
>>>time.time()
1516939876.6022282
#获取当前时间并以易读方式表示,返回字符串
>>>time.ctime()
'Fri Jan 26 12:11:16 2018'
#获取当前时间,表示为计算机可处理的时间格式
>>>time.gmtime()
time.struct_time(tm_year=2018, tm_mon=1,
tm_mday=26, tm_hour=4, tm_min=11, tm_sec=16,
tm_wday=4, tm_yday=26, tm_isdst=0)
将时间以合理的方式展示出来
函数 | 描述 |
---|---|
strftime(tpl, ts) | tpl是格式化模板字符串,用来定义输出效果 ts是计算机内部时间类型变量 |
strptime(str, tpl) | str是字符串形式的时间值 tpl是格式化模板字符串,用来定义输入效果 |
>>>t = time.gmtime()
>>>time.strftime("%Y-%m-%d %H:%M:%S",t)
'2018-01-26 12:55:20'
>>>timeStr = '2018-01-26 12:55:20'
>>>time.strptime(timeStr, "%Y-%m-%d %H:%M:%S")
time.struct_time(tm_year=2018,tm_mon=1,tm_mday=26, tm_hour=4, tm_min=11,tm_sec=16,tm_wday=4, tm_yday=26, tm_isdst=0)
格式化字符串 | 日期/时间说明 | 值范围和实例 |
---|---|---|
%Y | 年份 | 0000~9999,例如:1900 |
%m | 月份 | 01~12,例如:10 |
%B | 月份名称 | January~December,例如:April |
%b | 月份名称缩写 | Jan~Dec,例如:Apr |
%d | 日期 | 01~31,例如:25 |
%A | 星期 | Monday~Sunday,例如:Wednesday |
%a | 星期缩写 | Mon~Sun,例如:Wed |
%H | 小时(24h制) | 00~23,例如:12 |
%I | 小时(12h制) | 01~12,例如:7 |
%p | 上/下午 | AM, PM,例如:PM |
%M | 分钟 | 00~59,例如:26 |
%S | 秒 | 00~59,例如:26 |
程序计时应用广泛
函数 | 描述 |
---|---|
perf_counter() | 返回一个CPU级别的精确时间计数值,单位为秒 由于这个计数值起点不确定,连续调用差值才有意义 |
sleep(s) | s拟休眠的时间,单位是秒,可以是浮点数 |
>>>start = time.perf_counter()
318.66599499718114
>>>end = time.perf_counter()
341.3905185375658
>>>end - start
22.724523540384666
>>>def wait():
time.sleep(3.3)
>>>wait() #程序将等待3.3秒后再退出
https://docs.python.org/zh-cn/3/
文本进度条
如何获得文本进度条的变化时间?
#TextProBarV1.py 简单的开始
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%[**********->]
------执行结束------
刷新的关键是 \r
#TextProBarV2.py
import time
for i in range(101):
print("\r{:3}%".format(i), end="")
time.sleep(0.1)
IDLE屏蔽了\r功能
命令行执行(pycharm可以执行)
#TextProBarV3.py
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,'-'))
举一反三
计算问题扩展
进度条应用
文本进度条的不同设计函数
设计名称 | 趋势 | 设计函数 |
---|---|---|
Linear | Constant | f(x) = x |
Early Pause | Speeds up | f(x) = x+(1-sin(x*π*2+π/2)/-8 |
Late Pause | Slows down | f(x) = x+(1-sin(x*π*2+π/2)/8 |
Slow Wavy | Constant | f(x) = x+sin(x*π*5)/20 |
Fast Wavy | Constant | f(x) = x+sin(x*π*20)/80 |
Power | Speeds up | f(x) = (x+(1-x)*0.03)2 |
Inverse Power | Slows down | f(x) =1+(1-x)1.5 *-1 |
Fast Power | Speeds up | f(x) = (x+(1-x)/2)8 |
Inverse Fast Power | Slows down | f(x) = 1+(1-x)3 *-1 |
方法论
实践能力
根据判断条件结果而选择不同向前路径的运行方式
二分支示例
条件判断
操作符
操作符 | 数学符号 | 描述 |
---|---|---|
< | < | 小于 |
<= | ≤ | 小于等于 |
>= | ≥ | 大于等于 |
> | > | 大于 |
== | = | 等于 |
!= | ≠ | 不等于 |
用于条件组合的三个保留字
操作符及使用 | 描述 |
---|---|
x and y | 两个条件x和y的逻辑与 |
x or y | 两个条件x和y的逻辑或 |
not x | 条件x的逻辑非 |
示例
原来这个结构叫做异常处理,即便自己在爬取时经常使用这个结构,也不知道这叫异常处理。看来基础真的要牢固!
#异常处理
#示例1
try :
num = eval(input("请输入一个整数: "))
print(num**2)
except :
print("输入不是整数")
#异常处理
#示例2
try :
num = eval(input("请输入一个整数: "))
print(num**2)
#标注异常类型后,仅响应此类异常,异常类型名字等同于变量名
except NameError:
print("输入不是整数")
突然想起Verilog语言中的default就是防止生成锁存器
BMI:对身体质量的刻画
BMI:对身体质量的刻画
国际:世界卫生组织 国内:国家卫生健康委员会
分类 | 国际BMI值 (kg/m2) | 国内BMI值 (kg/m2) |
---|---|---|
偏瘦 | <18.5 | <18.5 |
正常 | 18.5 ~ 25 | 18.5 ~ 24 |
偏胖 | 25 ~ 30 | 24 ~ 28 |
肥胖 | ≥30 | ≥28 |
问题需求
思路方法
#CalBMIv1.py
height, weight = eval(input("请输入身高(米)和体重(公斤)[逗号隔开]: "))
bmi = weight / pow(height, 2)
print("BMI 数值为:{:.2f}".format(bmi))
who = ""
if bmi < 18.5:
who = "偏瘦"
elif 18.5 <= bmi < 25:
who = "正常"
elif 25 <= bmi < 30:
who = "偏胖"
else:
who = "肥胖"
print("BMI 指标为:国际'{0}'".format(who))
#CalBMIv2.py
height, weight = eval(input("请输入身高(米)和体重(公斤)[逗号隔开]: "))
bmi = weight / pow(height, 2)
print("BMI 数值为:{:.2f}".format(bmi))
nat = ""
if bmi < 18.5:
nat = "偏瘦"
elif 18.5 <= bmi < 24:
nat = "正常"
elif 24 <= bmi < 28:
nat = "偏胖"
else:
nat = "肥胖"
print("BMI 指标为:国内'{0}'".format(nat))
#CalBMIv3.py
height, weight = eval(input("请输入身高(米)和体重(公斤)[逗号隔开]: "))
bmi = weight / pow(height, 2)
print("BMI 数值为:{:.2f}".format(bmi))
who, nat = "", ""
if bmi < 18.5:
who, nat = "偏瘦", "偏瘦"
elif 18.5 <= bmi < 24:
who, nat = "正常", "正常"
elif 24 <= bmi < 25:
who, nat = "正常", "偏胖"
elif 25 <= bmi < 28:
who, nat = "偏胖", "偏胖"
elif 28 <= bmi < 30:
who, nat = "偏胖", "肥胖"
else:
who, nat = "肥胖", "肥胖"
print("BMI 指标为:国际'{0}', 国内'{1}'".format(who, nat))
关注多分支条件的组合
遍历某个结构形成的循环运行方式
计数循环(N次)
>>> for c in "Python123":
print(c,end=",")
P,y,t,h,o,n,1,2,3,
列表遍历循环
>>> for item in [123, "PY", 456]:
print(item, end=",")
123,PY,456,
>>>
由条件控制的循环运行方式
无限循环的条件
break 和 continue
循环与else
random库是使用随机数的Python标准库
random库包括两类函数,常用共8个
函数 | 描述 |
---|---|
seed(a=None) | 初始化给定的随机数种子,默认为当前系统时间 |
random() | 生成一个[0.0, 1.0)之间的随机小数 |
#产生种子10对应的序列
>>>random.seed(10)
#生成一个[0.0, 1.0)之间的随机小数
>>>random.random()
0.5714025946899135
函数 | 描述 |
---|---|
randint(a, b) | 生成一个[a, b]之间的整数 |
randrange(m, n, k) | 生成一个[m, n]之间以k为步长的随机整数 |
getrandbits(k) | 生成一个k比特长的随机整数 |
uniform(a, b) | 生成一个[a, b]之间的随机小数 |
choice(seq) | 从序列seq中随机选择一个元素 |
shuffle(seq) | 将序列seq中元素随机排列,返回打乱后的序列 |
>>> import random
#生成一个[10, 100]之间的整数
>>> random.randint(10, 100)
79
#生成一个[10, 100]之间以10为步长的随机整数
>>> random.randrange(10,100,10)
60
#生成一个16比特长的随机整数
>>> random.getrandbits(16)
33805
#生成一个[10, 100]之间的随机小数
>>> random.uniform(10, 100)
15.710497268060426
#从序列seq中随机选择一个元素
>>> random.choice([1,2,3,4,5,6,7,8,9])
1
#将序列seq中元素随机排列,返回打乱后的序列
>>> s=[1,2,3,4,5,6,7,8,9];random.shuffle(s);print(s)
[9, 5, 2, 7, 3, 1, 6, 8, 4]
需要掌握的能力
#CalPiV1.py
pi = 0
N = 100
for k in range(N) :
pi += 1/pow(16,k)*( \
4/(8*k+1) - 2/(8*k+4) - \
1/(8*k+5) - 1/(8*k+6))
print("圆周率值是: {}".format(pi))
运行结果:
圆周率值是: 3.141592653589793
#CalPiV2.py
from random import random
from time import perf_counter
DARTS = 1000*1000
hits = 0.0
start = perf_counter()
for i in range(1, DARTS+1):
x, y = random(), random()
dist = pow(x ** 2 + y ** 2, 0.5)
if dist <= 1.0:
hits = hits + 1
pi = 4 * (hits/DARTS)
print("圆周率值是: {}".format(pi))
print("运行时间是: {:.5f}s".format(perf_counter()-start))
运行结果:
圆周率值是: 3.138692
运行时间是: 0.84175s
理解方法思维
程序运行时间分析
计算问题的扩展
方法论
实践能力
函数是一段代码的表示
函数可以有参数,也可以没有,但必须保留括号
函数定义时可以为某些参数指定默认值,构成可选参数
函数可以返回0个或多个结果
函数调用时,参数可以按照位置或名称方式传递
规则1: 局部变量和全局变量是不同变量
lambda函数返回函数名作为结果
>>> f = lambda x,y:x+y
>>> f(10,15)
25
>>> f = lambda : "lambda函数"
>>> print(f())
lambda函数
>>>
谨慎使用lambda函数
七段数码管绘制
七段数码管绘制时间
基本思路
import turtle
def drawLine(draw): #绘制单段数码管
turtle.pendown() if draw else turtle.penup()
turtle.fd(40)
turtle.right(90)
def drawDigit(digit): #根据数字绘制七段数码管
drawLine(True) if digit in [2,3,4,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,6,8] else drawLine(False)
turtle.left(90)
drawLine(True) if digit in [0,4,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,3,5,6,7,8,9] else drawLine(False)
drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False)
turtle.left(180)
turtle.penup() #为绘制后续数字确定位置
turtle.fd(20) #为绘制后续数字确定位置
步骤2: 获取一段数字,绘制多个数码管
import turtle
def drawLine(draw): #绘制单段数码管
turtle.pendown() if draw else turtle.penup()
turtle.fd(40)
turtle.right(90)
def drawDigit(digit): #根据数字绘制七段数码管
drawLine(True) if digit in [2,3,4,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,6,8] else drawLine(False)
turtle.left(90)
drawLine(True) if digit in [0,4,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,3,5,6,7,8,9] else drawLine(False)
drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False)
turtle.left(180)
turtle.penup() #为绘制后续数字确定位置
turtle.fd(20) #为绘制后续数字确定位置
def drawDate(date): #获得要输出的数字
for i in date:
drawDigit(eval(i)) #通过eval()函数将数字变为整数
def main():
turtle.setup(800, 350, 200, 200)
turtle.penup()
turtle.fd(-300)
turtle.pensize(5)
drawDate('20181010')
turtle.hideturtle()
turtle.done()
main()
import turtle,time
def drawGap(): #绘制数码管间隔
turtle.penup()
turtle.fd(5)
def drawLine(draw): #绘制单段数码管
drawGap()
turtle.pendown() if draw else turtle.penup()
turtle.fd(40)
drawGap()
turtle.right(90)
def drawDigit(digit): #根据数字绘制七段数码管
drawLine(True) if digit in [2,3,4,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,6,8] else drawLine(False)
turtle.left(90)
drawLine(True) if digit in [0,4,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,3,5,6,7,8,9] else drawLine(False)
drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False)
turtle.left(180)
turtle.penup() #为绘制后续数字确定位置
turtle.fd(20) #为绘制后续数字确定位置
def drawDate(date): #获得要输出的数字,#data为日期,格式为 '%Y-%m=%d+'
turtle.pencolor("red")
for i in date:
if i == '-':
turtle.write('年', font=("Arial", 18, "normal"))
turtle.pencolor("green")
turtle.fd(40)
elif i == '=':
turtle.write('月', font=("Arial", 18, "normal"))
turtle.pencolor("blue")
turtle.fd(40)
elif i == '+':
turtle.write('日', font=("Arial", 18, "normal"))
else:
drawDigit(eval(i))
def main():
turtle.setup(800, 350, 200, 200)
turtle.penup()
turtle.fd(-300)
turtle.pensize(5)
drawDate(time.strftime('%Y-%m=%d+',time.gmtime()))
turtle.hideturtle()
turtle.done()
main()
理解方法思维
应用问题的扩展
把代码当成资源进行抽象
分而治之
紧耦合 松耦合
函数定义中调用函数自身的方式
类似数学归纳法
count = 0
def hanoi(n, src, dst, mid):
global count
if n == 1 :
print("{}:{}->{}".format(1,src,dst))
count += 1
else :
hanoi(n-1, src, mid, dst)
print("{}:{}->{}".format(n,src,dst))
count += 1
hanoi(n-1, mid, dst, src)
hanoi(3, "A", "C", "B")
print(count)
运行结果:
1:A->C
2:A->B
1:C->B
3:A->C
1:B->A
2:B->C
1:A->C
7
将.py源代码转换成无需源代码的可执行文件,竟然忘记了这个,哈哈!
PyInstaller库是第三方库
(cmd命令行) pip install pyinstaller
(cmd命令行) pyinstaller -F <文件名.py>
参数 | 描述 |
---|---|
-h | 查看帮助 |
–clean | 清理打包过程中的临时文件 |
-D, --onedir | 默认值,生成dist文件夹 |
-F, --onefile | 在dist文件夹中只生成独立的打包文件 |
-i <图标文件名.ico> | 指定打包程序使用的图标(icon)文件 |
使用举例
pyinstaller –i curve.ico –F SevenDigitsDrawV2.py
科赫曲线的绘制
#KochDrawV1.py 科赫曲线的绘制
import turtle
def koch(size, n):
if n == 0:
turtle.fd(size)
else:
for angle in [0, 60, -120, 60]:
turtle.left(angle)
koch(size/3, n-1)
def main():
turtle.setup(800,400)
turtle.penup()
turtle.goto(-300, -50)
turtle.pendown()
turtle.pensize(2)
koch(600, 3) # 3阶科赫曲线,阶数
turtle.hideturtle()
main()
#KochDrawV2.py 科赫雪花的绘制
import turtle
def koch(size, n):
if n == 0:
turtle.fd(size)
else:
for angle in [0, 60, -120, 60]:
turtle.left(angle)
koch(size/3, n-1)
def main():
turtle.setup(600, 600)
turtle.penup()
turtle.goto(-200, 100)
turtle.pendown()
turtle.pensize(2)
level = 3 # 3阶科赫雪花,阶数
koch(400, level)
turtle.right(120)
koch(400, level)
turtle.right(120)
koch(400, level)
turtle.hideturtle()
main()
打包才能上路…
pyinstaller –i curve.ico –F KochDrawV2.py
分形几何千千万
方法论
实践能力
集合是多个元素的无序组合
集合是多个元素的无序组合
#使用{}建立集合
>>> A = {
"python", 123, ("python",123)}
>>> print(A)
{
('python', 123), 123, 'python'}
#使用set()建立集合
>>> B=set("python")
>>> print(B)
{
'n', 't', 'y', 'p', 'o', 'h'}
>>> c= {
"python", 123, "python",123}
>>> print(c)
{
123, 'python'}
集合间操作
6个操作符
操作符及应用 | 描述 |
---|---|
S | T | 并,返回一个新集合,包括在集合S和T中的所有元素 |
S - T | 差,返回一个新集合,包括在集合S但不在T中的元素 |
S & T | 交,返回一个新集合,包括同时在集合S和T中的元素 |
S ^ T | 补,返回一个新集合,包括集合S和T中的非相同元素 |
S <= T 或 S < T | 返回True/False,判断S和T的子集关系 |
S >= T 或 S > T | 返回True/False,判断S和T的包含关系 |
4个增强操作符
操作符及应用 | 描述 |
---|---|
S|= T | 并,更新集合S,包括在集合S和T中的所有元素 |
S -= T | 差,更新集合S,包括在集合S但不在T中的元素 |
S &= T | 交,更新集合S,包括同时在集合S和T中的元素 |
S ^= T | 补,更新集合S,包括集合S和T中的非相同元素 |
>>> A = {
"p","y",123}
>>> B = set("pypy123")
#差
>>> A-B
{
123}
>>> B-A
{
'3', '1', '2'}
#交
>>> A&B
{
'y', 'p'}
#并
>>> A|B
{
'3', '1', 'y', 123, 'p', '2'}
#补
>>> A^B
{
'3', 123, '1', '2'}
操作函数或方法 | 描述 |
---|---|
S.add(x) | 如果x不在集合S中,将x增加到S |
S.discard(x) | 移除S中元素x,如果x不在集合S中,不报错 |
S.remove(x) | 移除S中元素x,如果x不在集合S中,产生KeyError异常 |
S.clear() | 移除S中所有元素 |
S.pop() | 随机返回S的一个元素,更新S,若S为空产生KeyError异常 |
S.copy() | 返回集合S的一个副本 |
len(S) | 返回集合S的元素个数 |
x in S | 判断S中元素x,x在集合S中,返回True,否则返回False |
x not in S | 判断S中元素x,x不在集合S中,返回True,否则返回False |
set(x) | 将其他类型变量x转变为集合类型 |
>>> A = {
"p","y",123}
>>> for item in A:
print(item,end="")
y123p
>>> A
{
'y', 123, 'p'}
>>> try:
while True:
print(A.pop(),end="")
except:
pass
y123p
>>> A
set()
包含关系比较
>>> "p" in {
"p","y",123}
True
>>> {
"p","y"} >= {
"p","y",123}
False
>>>
数据去重:集合类型所有元素无重复
>>> ls = ["p","p","y","y",123]
# 利用了集合无重复元素的特点
>>> s = set(ls)
>>> print(s)
{
'y', 123, 'p'}
# 还可以将集合转换为列表
>>> lt = list(s)
>>> print(lt)
['y', 123, 'p']
序列是具有先后关系的一组元素
序列是一个基类类型
6个操作符
操作符及应用 | 描述 |
---|---|
x in s | 如果x是序列s的元素,返回True,否则返回False |
x not in s | 如果x是序列s的元素,返回False,否则返回True |
s + t | 连接两个序列s和t |
s*n 或 n*s | 将序列s复制n次 |
s[i] | 索引,返回s中的第i个元素,i是序列的序号 |
s[i: j] 或 s[i: j: k] | 切片,返回序列s中第i到j以k为步长的元素子序列 |
>>> ls = ["python",123,".io"]
>>> ls[::-1]
['.io', 123, 'python']
>>> s = "python123.io"
>>> s[::-1]
'oi.321nohtyp'
绘制条件的扩展
函数和方法 | 描述 |
---|---|
len(s) | 返回序列s的长度,即元素个数 |
min(s) | 返回序列s的最小元素,s中元素需要可比较 |
max(s) | 返回序列s的最大元素,s中元素需要可比较 |
s.index(x) 或s.index(x, i, j) | 返回序列s从i开始到j位置中第一次出现元素x的位置 |
s.count(x) | 返回序列s中出现x的总次数 |
>>> ls = ["python",123,".io"]
>>> len(ls)
3
>>> s = "python123.io"
>>> max(s)
'y'
元组是序列类型的一种扩展
>>> creature = "cat","dog","tiger","human"
>>> creature
('cat', 'dog', 'tiger', 'human')
>>> color = (0x001100,"blue",creature)
>>> color
(4352, 'blue', ('cat', 'dog', 'tiger', 'human'))
>>>
元组继承序列类型的全部通用操作
>>> creature = "cat","dog","tiger","human"
>>> creature
('cat', 'dog', 'tiger', 'human')
>>> color = (0x001100,"blue",creature)
>>> color
(4352, 'blue', ('cat', 'dog', 'tiger', 'human'))
>>> color[-1][-2]
'tiger'
>>>
列表是序列类型的一种扩展,十分常用
>>> ls = ["cat", "dog", "tiger", 1024]
>>> ls
['cat', 'dog', 'tiger', 1024]
>>> lt = ls
>>> lt
['cat', 'dog', 'tiger', 1024]
>>>
方括号 [] 真正创建一个列表,赋值仅传递引用
函数或方法 | 描述 |
---|---|
ls[i] = x | 替换列表ls第i元素为x |
ls[i: j: k] = lt | 用列表lt替换ls切片后所对应元素子列表 |
del ls[i] | 删除列表ls中第i元素 |
del ls[i: j: k] | 删除列表ls中第i到第j以k为步长的元素 |
ls += lt | 更新列表ls,将列表lt元素增加到列表ls中 |
ls *= n | 更新列表ls,其元素重复n次 |
ls.append(x) | 在列表ls最后增加一个元素x |
ls.clear() | 删除列表ls中所有元素 |
ls.copy() | 生成一个新列表,赋值ls中所有元素 |
ls.insert(i,x) | 在列表ls的第i位置增加元素x |
ls.pop(i) | 将列表ls中第i位置元素取出并删除该元素 |
ls.remove(x) | 将列表ls中出现的第一个元素x删除 |
ls.reverse() | 将列表ls中的元素反转 |
>>> ls = ["cat", "dog", "tiger", 1024]
>>> ls[1:2]=[1,2,3,4]
>>> ls
['cat', 1, 2, 3, 4, 'tiger', 1024]
>>> del ls[::3]
>>> ls
[1, 2, 4, 'tiger']
>>> ls*2
[1, 2, 4, 'tiger', 1, 2, 4, 'tiger']
>>> ls = ["cat", "dog", "tiger", 1024]
>>> ls.append(1234)
>>> ls
['cat', 'dog', 'tiger', 1024, 1234]
>>> ls.insert(3,"human")
>>> ls
['cat', 'dog', 'tiger', 'human', 1024, 1234]
>>> ls.reverse()
>>> ls
[1234, 1024, 'human', 'tiger', 'dog', 'cat']
>>>
定义空列表lt
向lt新增5个元素
修改lt中第2个元素
向lt中第2个位置增加一个元素
从lt中第1个位置删除一个元素
删除lt中第1-3位置元素
判断lt中是否包含数字0
向lt新增数字0
返回数字0所在lt中的索引
lt的长度
lt中最大元素
清空lt
数据表示:元组 和 列表
元素遍历
for item in ls : <语句块>
for item in tp : <语句块>
数据保护
>>> ls = ["cat", "dog", "tiger", 1024]
>>> lt = tuple(ls)
>>> lt
('cat', 'dog', 'tiger', 1024)
序列类型及操作
基本统计值
#CalStatisticsV1.py 基本统计值计算
#获取用户不定长度的输入
def getNum():
nums = []
iNumStr = input("请输入数字(回车退出): ")
while iNumStr != "":
nums.append(eval(iNumStr))
iNumStr = input("请输入数字(回车退出): ")
return nums
#计算平均值
def mean(numbers):
s = 0.0
for num in numbers:
s = s + num
return s / len(numbers)
#计算方差
def dev(numbers, mean):
sdev = 0.0
for num in numbers:
sdev = sdev + (num - mean)**2
return pow(sdev / (len(numbers)-1), 0.5)
#计算中位数
def median(numbers):
sorted(numbers)
size = len(numbers)
if size % 2 == 0:
med = (numbers[size//2-1] + numbers[size//2])/2
else:
med = numbers[size//2]
return med
n = getNum()
m = mean(n)
print("平均值:{},方差:{:.2},中位数:{}.".format(m, dev(n,m),median(n)))
技术能力扩展
理解“映射”
在字典变量中,通过键获得值
>>> d = {
"中国":"北京", "美国":"华盛顿", "法国":"巴黎"}
>>> d
{
'中国': '北京', '美国': '华盛顿', '法国': '巴黎'}
>>> d["中国"]
'北京'
>>> de={
};type(de)
<class 'dict'>
>>>
函数或方法 | 描述 |
---|---|
del d[k] | 删除字典d中键k对应的数据值 |
k in d | 判断键k是否在字典d中,如果在返回True,否则False |
d.keys() | 返回字典d中所有的键信息 |
d.values() | 返回字典d中所有的值信息 |
d.items() | 返回字典d中所有的键值对信息 |
d.get(k, ) | 键k存在,则返回相应值,不在则返回值 |
d.pop(k, ) | 键k存在,则取出相应值,不在则返回值 |
d.popitem() | 随机从字典d中取出一个键值对,以元组形式返回 |
d.clear() | 删除所有的键值对 |
len(d) | 返回字典d中元素的个数 |
>>> d = {
"中国":"北京", "美国":"华盛顿", "法国":"巴黎"}
>>> "中国" in d
True
>>> d.keys()
dict_keys(['中国', '美国', '法国'])
>>> d.values()
dict_values(['北京', '华盛顿', '巴黎'])
>>>
定义空字典d
向d新增2个键值对元素
修改第2个元素
判断字符"c"是否是d的键
计算d的长度
清空d
映射的表达
元素遍历
for k in d : <语句块>
字典类型及操作
jieba是优秀的中文分词第三方库
(cmd命令行) pip install jieba
jieba分词依靠中文词库
精确模式、全模式、搜索引擎模式
函数 | 描述 |
---|---|
jieba.lcut(s) | 精确模式,返回一个列表类型的分词结果 |
jieba.lcut(s, cut_all=True) | 全模式,返回一个列表类型的分词结果,存在冗余 |
jieba.lcut_for_search(s) | 搜索引擎模式,返回一个列表类型的分词结果,存在冗余 |
jieba.add_word(w) | 向分词词典增加新词w |
>>> import jieba
#精确模式,返回一个列表类型的分词结果
>>> jieba.lcut("中国是一个伟大的国家")
Building prefix dict from the default dictionary ...
Dumping model to file cache C:\Users\···\Temp\jieba.cache
Loading model cost 0.787 seconds.
Prefix dict has been built successfully.
['中国', '是', '一个', '伟大', '的', '国家']
#全模式,返回一个列表类型的分词结果,存在冗余
>>> jieba.lcut("中国是一个伟大的国家",cut_all=True)
['中国', '国是', '一个', '伟大', '的', '国家']
#搜索引擎模式,返回一个列表类型的分词结果,存在冗余
>>> jieba.lcut_for_search("中华人民共和国是伟大的")
['中华', '华人', '人民', '共和', '共和国', '中华人民共和国', '是', '伟大', '的']
#向分词词典增加新词w
>>>jieba.add_word("蟒蛇语言")
jieba.lcut(s)
文本词频统计
需求:一篇文章,出现了哪些词?哪些词出现得最多?
该怎么做呢?
英文文本 -> 中文文本
英文文本:Hamet 分析词频
https://python123.io/resources/pye/hamlet.txt
中文文本:《三国演义》 分析人物
https://python123.io/resources/pye/threekingdoms.txt
#CalHamletV1.py
def getText():
txt = open("hamlet.txt", "r").read()
txt = txt.lower()
for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':
txt = txt.replace(ch, " ")
return txt
hamletTxt = getText()
words = hamletTxt.split()
counts = {
}
for word in words:
counts[word] = counts.get(word,0) + 1
items = list(counts.items())
items.sort(key=lambda x:x[1], reverse=True)
for i in range(10):
word, count = items[i]
print("{0:<10}{1:>5}".format(word, count))
运行结果:
the 1138
and 965
to 754
of 669
you 550
i 542
a 542
my 514
hamlet 462
in 436
#CalThreeKingdomsV1.py
import jieba
txt = open("threekingdoms.txt", "r", encoding="utf-8").read()
words = jieba.lcut(txt)
counts = {
}
for word in words:
if len(word) == 1:
continue
else:
counts[word] = counts.get(word,0) + 1
items = list(counts.items())
items.sort(key=lambda x:x[1], reverse=True)
for i in range(15):
word, count = items[i]
print("{0:<10}{1:>5}".format(word, count))
运行结果:
曹操 953
孔明 836
将军 772
却说 656
玄德 585
关公 510
丞相 491
二人 469
不可 440
荆州 425
玄德曰 390
孔明曰 390
不能 384
如此 378
张飞 358
将词频与人物相关联,面向问题
词频统计 ->人物统计
#CalThreeKingdomsV2.py
import jieba
txt = open("threekingdoms.txt", "r", encoding="utf-8").read()
excludes = {
"将军","却说","荆州","二人","不可","不能","如此"}
words = jieba.lcut(txt)
counts = {
}
for word in words:
if len(word) == 1:
continue
elif word == "诸葛亮" or word == "孔明曰":
rword = "孔明"
elif word == "关公" or word == "云长":
rword = "关羽"
elif word == "玄德" or word == "玄德曰":
rword = "刘备"
elif word == "孟德" or word == "丞相":
rword = "曹操"
else:
rword = word
counts[rword] = counts.get(rword,0) + 1
for word in excludes:
del counts[word]
items = list(counts.items())
items.sort(key=lambda x:x[1], reverse=True)
for i in range(10):
word, count = items[i]
print("{0:<10}{1:>5}".format(word, count))
运行结果:
#CalThreeKingdomsV2.py
import jieba
txt = open("threekingdoms.txt", "r", encoding="utf-8").read()
excludes = {
"将军","却说","荆州","二人","不可","不能","如此"}
words = jieba.lcut(txt)
counts = {
}
for word in words:
if len(word) == 1:
continue
elif word == "诸葛亮" or word == "孔明曰":
rword = "孔明"
elif word == "关公" or word == "云长":
rword = "关羽"
elif word == "玄德" or word == "玄德曰":
rword = "刘备"
elif word == "孟德" or word == "丞相":
rword = "曹操"
else:
rword = word
counts[rword] = counts.get(rword,0) + 1
for word in excludes:
del counts[word]
items = list(counts.items())
items.sort(key=lambda x:x[1], reverse=True)
for i in range(10):
word, count = items[i]
print("{0:<10}{1:>5}".format(word, count))
应用问题的扩展
方法论
实践能力
文件是数据的抽象和集合
文本文件 vs. 二进制文件
文件是数据的抽象和集合
文件处理的步骤: 打开-操作-关闭
文件的打开模式 | 描述 |
---|---|
‘r’ | 只读模式,默认值,如果文件不存在,返回FileNotFoundError |
‘w’ | 覆盖写模式,文件不存在则创建,存在则完全覆盖 |
‘x’ | 创建写模式,文件不存在则创建,存在则返回FileExistsError |
‘a’ | 追加写模式,文件不存在则创建,存在则在文件最后追加内容 |
‘b’ | 二进制文件模式 |
‘t’ | 文本文件模式,默认值 |
‘+’ | 与r/w/x/a一同使用,在原功能基础上增加同时读写功能 |
文件的关闭
<变量名>.close()
操作方法 | 描述 |
---|---|
读入全部内容,如果给出参数,读入前size长度 | |
.readline(size=-1) | 读入一行内容,如果给出参数,读入该行前size长度 |
.readlines(hint=-1) | 读入文件所有行,以每行为元素形成列表 如果给出参数,读入前hint行 |
#这段代码没有运行
>>>s = f.read(2)
中国
>>>s = f.readline()
中国是一个伟大的国家!
>>>s = f.readlines()
['中国是一个伟大的国家!']
遍历全文本:方法一
fname = input("请输入要打开的文件名称:")
fo = open(fname,"r")
txt = fo.read()
#对全文txt进行处理
fo.close()
运行报错(?):
txt = fo.read()
UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 2: illegal multibyte sequence
遍历全文本:方法二
fname = input("请输入要打开的文件名称:")
fo = open(fname,"r")
txt = fo.read(2)
while txt != "":
#对txt进行处理
txt = fo.read(2)
fo.close()
逐行遍历文件:方法一
fname = input("请输入要打开的文件名称:")
fo = open(fname,"r")
for line in fo.readlines():
print(line)
fo.close()
逐行遍历文件:方法二
fname = input("请输入要打开的文件名称:")
fo = open(fname,"r")
for line in fo:
print(line)
fo.close()
操作方法 | 描述 |
---|---|
向文件写入一个字符串或字节流 | |
将一个元素全为字符串的列表写入文件 | |
改变当前文件操作指针的位置,offset含义如下: 0 – 文件开头; 1 – 当前位置; 2 – 文件结尾 |
>>>f.write("中国是一个伟大的国家!")
>>>ls = ["中国", "法国", "美国"]
>>>f.writelines(ls)
中国法国美国
>>>f.seek(0) #回到文件开头
fo = open("output.txt","w+")
ls = ["中国", "法国", "美国"]
fo.writelines(ls)
for line in fo:
print(line)
fo.close()
>>> (没有任何输出)
fo = open("output.txt","w+")
ls = ["中国", "法国", "美国"]
fo.writelines(ls)
fo.seek(0)
for line in fo:
print(line)
fo.close()
>>>
中国法国美国
文件的使用
自动轨迹绘制
基本思路
#AutoTraceDraw.py
import turtle as t
t.title('自动轨迹绘制')
t.setup(800, 600, 0, 0)
t.pencolor("red")
t.pensize(5)
#数据读取
datals = []
f = open("data.txt")
for line in f:
line = line.replace("\n","")
datals.append(list(map(eval, line.split(","))))
f.close()
#自动绘制
for i in range(len(datals)):
t.pencolor(datals[i][3],datals[i][4],datals[i][5])
t.fd(datals[i][0])
if datals[i][1]:
t.right(datals[i][2])
else:
t.left(datals[i][2])
#data.txt
300,0,144,1,0,0
300,0,144,0,1,0
300,0,144,0,0,1
300,0,144,1,1,0
300,0,108,0,1,1
184,0,72,1,0,1
184,0,72,0,0,0
184,0,72,0,0,0
184,0,72,0,0,0
184,1,72,1,0,1
184,1,72,0,0,0
184,1,72,0,0,0
184,1,72,0,0,0
184,1,72,0,0,0
184,1,720,0,0,0
理解方法思维
应用问题的扩展
如何进一步提高Python编程能力?
三个步骤,请参考:https://python123.io/python
由对等关系的有序或无序数据构成,采用线性方式组织
3.1413, 3.1398, 3.1404, 3.1401, 3.1349, 3.1376
由多个一维数据构成,是一维数据的组合形式
表格是典型的二维数据
其中,表头是二维数据的一部分
仅利用最基本的二元关系展示数据间的复杂结构
{
"firstName" : "Tian" ,
"lastName" : "Song" ,
"address" : {
"streetAddr" : "中关村南大街5号" ,
"city" : "北京市" ,
"zipcode" : "100081"
} ,
"professional" : ["Computer Networking" , "Security"]
}
如果数据间有序:使用列表类型
ls = [3.1398, 3.1349, 3.1376]
如果数据间无序:使用集合类型
st = {3.1398, 3.1349, 3.1376}
存储方式一:空格分隔
中国 美国 日本 德国 法国 英国 意大利
存储方式二:逗号分隔
中国,美国,日本,德国,法国,英国,意大利
存储方式三:其他方式
中国$美国$日本$德国$法国$英国$意大利
存储 <-> 表示
从空格分隔的文件中读入数据
中国 美国 日本 德国 法国 英国 意大利
从特殊符号分隔的文件中读入数据
采用空格分隔方式将数据写入文件
ls = ['中国', '美国', '日本']
f = open(fname, 'w')
f.write(' '.join(ls))
f.close()
采用特殊分隔方式将数据写入文件
ls = ['中国', '美国', '日本']
f = open(fname, 'w')
f.write('$'.join(ls))
f.close()
一维数据的格式化和处理
使用列表类型
CSV: Comma-Separated Values
按行存?按列存?
从CSV格式的文件中读入数据
fo = open(fname)
ls = []
for line in fo:
line = line.replace("\n","")
ls.append(line.split(","))
fo.close()
将数据写入CSV格式的文件
ls = [[], [], []] #二维列表
f = open(fname, 'w')
for item in ls:
f.write(','.join(item) + '\n')
f.close()
采用二层循环
ls = [[1,2], [3,4], [5,6]] #二维列表
for row in ls:
for column in row:
print(column)
二维数据的格式化和处理
(cmd命令行) pip install wordcloud
wordcloud库把词云当作一个WordCloud对象
w = wordcloud.WordCloud()
方法 | 描述 |
---|---|
w.generate(txt) | 向WordCloud对象w中加载文本txt >>>w.generate(“Python and WordCloud”) |
w.to_file(filename) | 将词云输出为图像文件,.png或.jpg格式 >>>w.to_file(“outfile.png”) |
import wordcloud
c = wordcloud.WordCloud()
c.generate("wordcloud by Python")
c.to_file("pywordcloud.png")
w = wordcloud.WordCloud(<参数>)
参数 | 描述 |
---|---|
width | 指定词云对象生成图片的宽度,默认400像素 |
height | 指定词云对象生成图片的高度,默认200像素 |
min_font_size | 指定词云中字体的最小字号,默认4号 |
max_font_size | 指定词云中字体的最大字号,根据高度自动调节 |
font_step | 指定词云中字体字号的步进间隔,默认为1 |
font_path | 指定字体文件的路径,默认None |
max_words | 指定词云显示的最大单词数量,默认200 |
stop_words | 指定词云的排除词列表,即不显示的单词列表 |
mask | 指定词云形状,默认为长方形,需要引用imread()函数 |
background_color | 指定词云图片的背景颜色,默认为黑色 |
#指定词云对象生成图片的宽度,默认400像素
>>>w=wordcloud.WordCloud(width=600)
#指定词云对象生成图片的高度,默认200像素
>>>w=wordcloud.WordCloud(height=400)
#指定词云中字体的最小字号,默认4号
>>>w=wordcloud.WordCloud(min_font_size=10)
#指定词云中字体的最大字号,根据高度自动调节
>>>w=wordcloud.WordCloud(max_font_size=20)
#指定词云中字体字号的步进间隔,默认为1
>>>w=wordcloud.WordCloud(font_step=2)
#指定字体文件的路径,默认None
>>>w=wordcloud.WordCloud(font_path="msyh.ttc")
#指定词云显示的最大单词数量,默认200
>>>w=wordcloud.WordCloud(max_words=20)
#指定词云的排除词列表,即不显示的单词列表
>>>w=wordcloud.WordCloud(stop_words={
"Python"})
# 指定词云形状,默认为长方形,需要引用imread()函数
>>>from scipy.misc import imread
>>>mk=imread("pic.png")
>>>w=wordcloud.WordCloud(mask=mk)
#指定词云图片的背景颜色,默认为黑色
>>>w=wordcloud.WordCloud(background_color="white")
以空格分隔单词
import wordcloud
txt = "life is short, you need python"
w = wordcloud.WordCloud( \
background_color = "white")
w.generate(txt)
w.to_file("pywcloud.png")
运行结果:
#中文需要先分词并组成空格分隔字符串
import jieba
import wordcloud
txt = "程序设计语言是计算机能够理解和\
识别用户操作意图的一种交互体系,它按照\
特定规则组织计算机指令,使计算机能够自\
动进行各种运算处理。"
w = wordcloud.WordCloud( width=1000,\
font_path="msyh.ttc",height=700)
w.generate(" ".join(jieba.lcut(txt)))
w.to_file("pywcloud.png")
直观理解政策文件
https://python123.io/resources/pye/新时代中国特色社会主义.txt
https://python123.io/resources/pye/关于实施乡村振兴战略的意见.txt
基本思路
#GovRptWordCloudv1.py
import jieba
import wordcloud
f = open("新时代中国特色社会主义.txt", "r", encoding="utf-8")
t = f.read()
f.close()
ls = jieba.lcut(t)
txt = " ".join(ls)
w = wordcloud.WordCloud( font_path = "msyh.ttc",\
width = 1000, height = 700, background_color = "white", \
)
w.generate(txt)
w.to_file("grwordcloud.png")
#GovRptWordCloudv1.py
import jieba
import wordcloud
f = open("关于实施乡村振兴战略的意见.txt", "r", encoding="utf-8")
t = f.read()
f.close()
ls = jieba.lcut(t)
txt = " ".join(ls)
w = wordcloud.WordCloud( font_path = "msyh.ttc",\
width = 1000, height = 700, background_color = "white", \
)
w.generate(txt)
w.to_file("grwordcloud.png")
#GovRptWordCloudv1.py
import jieba
import wordcloud
f = open("新时代中国特色社会主义.txt", "r", encoding="utf-8")
t = f.read()
f.close()
ls = jieba.lcut(t)
txt = " ".join(ls)
w = wordcloud.WordCloud( font_path = "msyh.ttc",\
width = 1000, height = 700, background_color = "white", \
max_words = 15)
w.generate(txt)
w.to_file("grwordcloud.png")
#GovRptWordCloudv1.py
import jieba
import wordcloud
f = open("关于实施乡村振兴战略的意见.txt", "r", encoding="utf-8")
t = f.read()
f.close()
ls = jieba.lcut(t)
txt = " ".join(ls)
w = wordcloud.WordCloud( font_path = "msyh.ttc",\
width = 1000, height = 700, background_color = "white", \
max_words = 15)
w.generate(txt)
w.to_file("grwordcloud.png")
#GovRptWordCloudv2.py
import jieba
import wordcloud
from imageio import imread
mask = imread("fivestar.png")
f = open("新时代中国特色社会主义.txt", "r", encoding="utf-8")
t = f.read()
f.close()
ls = jieba.lcut(t)
txt = " ".join(ls)
w = wordcloud.WordCloud( font_path = "msyh.ttc", mask = mask\
width = 1000, height = 700, background_color = "white", \
)
w.generate(txt)
w.to_file("grwordcloud.png")
#GovRptWordCloudv2.py
import jieba
import wordcloud
from imageio import imread
mask = imread("bitlogo.png")
f = open("新时代中国特色社会主义.txt", "r", encoding="utf-8")
t = f.read()
f.close()
ls = jieba.lcut(t)
txt = " ".join(ls)
w = wordcloud.WordCloud( font_path = "msyh.ttc", mask = mask\
width = 1000, height = 700, background_color = "white", \
)
w.generate(txt)
w.to_file("grwordcloud.png")
扩展能力
方法论
实践能力
体育竞技分析
体育竞技分析:模拟N场比赛
比赛规则
解决复杂问题的有效方法
(看到这里,突然明白IC验证时,为什么会有自顶向下和自底向上)
逐步组建复杂系统的有效测试方法
程序总体框架及步骤
#第一阶段
def printSummary(winsA, winsB):
n = winsA + winsB
print("竞技分析开始,共模拟{}场比赛".format(n))
print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA, winsA/n))
print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB, winsB/n))
#第二阶段
def simNGames(n, probA, probB):
winsA, winsB = 0, 0
for i in range(n):
scoreA, scoreB = simOneGame(probA, probB)
if scoreA > scoreB:
winsA += 1
else:
winsB += 1
return winsA, winsB
#第三阶段
def simOneGame(probA, probB):
scoreA, scoreB = 0, 0
serving = "A"
while not gameOver(scoreA, scoreB):
if serving == "A":
if random() < probA:
scoreA += 1
else:
serving="B"
else:
if random() < probB:
scoreB += 1
else:
serving="A"
return scoreA, scoreB
def gameOver(a,b):
return a==15 or b==15
理解自顶向下和自底向上
应用问题的扩展
Python程序设计思维
PyPI
实例:开发与区块链相关的程序
三种方法
受教了,之前是先学的网络爬虫,安装第三方库碰了不少灰,看来基础知识真的很重要。人们往往知道一些东西,但就是自己做不到
强调一点:将下载源切换到本国,否则经常报错
主要方法,适合99%以上情况
集成安装:结合特定Python开发工具的批量安装
Anaconda
https://www.continuum.io
为什么有些第三方库用pip可以下载,但无法安装?
http://www.lfd.uci.edu/~gohlke/pythonlibs/
实例:安装wordcloud库
Python第三方库安装
os库提供通用的、基本的操作系统交互功能
os.path子库以path为入口,用于操作和处理文件路径
import os.path
或
import os.path as op
函数 | 描述 |
---|---|
os.path.abspath(path) | 返回path在当前系统中的绝对路径 |
os.path.normpath(path) | 归一化path的表示形式,统一用\\分隔路径 |
os.path.relpath(path) | 返回当前程序与文件之间的相对路径 (relative path) |
os.path.dirname(path) | 返回path中的目录名称 |
os.path.basename(path) | 返回path中最后的文件名称 |
os.path.join(path, *paths) | 组合path与paths,返回一个路径字符串 |
os.path.exists(path) | 判断path对应文件或目录是否存在,返回True或False |
os.path.isfile(path) | 判断path所对应是否为已存在的文件,返回True或False |
os.path.isdir(path) | 判断path所对应是否为已存在的目录,返回True或False |
os.path.getatime(path) | 返回path对应文件或目录上一次的访问时间 |
os.path.getmtime(path) | 返回path对应文件或目录最近一次的修改时间 |
os.path.getctime(path) | 返回path对应文件或目录的创建时间 |
os.path.getsize(path) | 返回path对应文件的大小,以字节为单位 |
#返回path在当前系统中的绝对路径
>>>os.path.abspath("file.txt")
'C:\\Users\\Tian Song\\Python36-32\\file.txt'
#归一化path的表示形式,统一用\\分隔路径
>>>os.path.normpath("D://PYE//file.txt")
'D:\\PYE\\file.txt'
#返回当前程序与文件之间的相对路径 (relative path)
>>>os.path.relpath("C://PYE//file.txt")
'..\\..\\..\\..\\..\\..\\..\\PYE\\file.txt'
#返回path中的目录名称
>>>os.path.dirname("D://PYE//file.txt")
'D://PYE'
#返回path中最后的文件名称
>>>os.path.basename("D://PYE//file.txt")
'file.txt'
#组合path与paths,返回一个路径字符串
>>>os.path.join("D:/", "PYE/file.txt")
'D:/PYE/file.txt'
#判断path对应文件或目录是否存在,返回True或False
>>>os.path.exists("D://PYE//file.txt")
False
#判断path所对应是否为已存在的文件,返回True或False
>>>os.path.isfile("D://PYE//file.txt")
True
#判断path所对应是否为已存在的目录,返回True或False
>>>os.path.isdir("D://PYE//file.txt")
False
#返回path对应文件或目录上一次的访问时间
>>>os.path.getatime("D:/PYE/file.txt")
1518356633.7551725
#返回path对应文件或目录最近一次的修改时间
>>>os.path.getmtime("D:/PYE/file.txt")
1518356633.7551725
#返回path对应文件或目录的创建时间
>>time.ctime(os.path.getctime("D:/PYE/file.txt"))
'Sun Feb 11 21:43:53 2018'
#返回path对应文件的大小,以字节为单位
>>>os.path.getsize("D:/PYE/file.txt")
180768
os.system(command)
获取或改变系统环境信息
函数 | 描述 |
---|---|
os.chdir(path) | 修改当前程序操作的路径 |
os.getcwd() | 返回程序的当前路径 |
os.getlogin() | 获得当前系统登录用户名称 |
os.cpu_count() | 获得当前系统的CPU数量 |
os.urandom(n) | 获得n个字节长度的随机字符串,通常用于加解密运算 |
#修改当前程序操作的路径
>>>os.chdir("D:")
#返回程序的当前路径
>>>os.getcwd()
'D:\\'
#获得当前系统登录用户名称
>>>os.getlogin()
'Tian Song'
#获得当前系统的CPU数量
>>>os.cpu_count()
8
#获得n个字节长度的随机字符串,通常用于加解密运算
>>>os.urandom(10)
b'7\xbe\xf2!\xc1=\x01gL\xb3'
第三方库自动安装脚本
如何自动执行一个程序?例如:pip?
第三方库自动安装脚本
库名 | 用途 | pip安装指令 |
---|---|---|
NumPy | N维数据表示和运算 | pip install numpy |
Matplotlib | 二维数据可视化 | pip install matplotlib |
PIL | 图像处理 | pip install pillow |
Scikit-Learn | 机器学习和数据挖掘 | pip install sklearn |
Requests | HTTP协议访问及网络爬虫 | pip install requests |
Jieba | 中文分词 | pip install jieba |
Beautiful Soup | HTML和XML解析器 | pip install beautifulsoup4 |
Wheel | Python第三方库文件打包工具 | pip install wheel |
PyInstaller | 打包Python源文件为可执行文件 | pip install pyinstaller |
Django | Python最流行的Web开发框架 | pip install django |
Flask | 轻量级Web开发框架 | pip install flask |
WeRoBot | 微信机器人开发框架 | pip install werobot |
SymPy | 数学符号计算工具 | pip install sympy |
Pandas | 高效数据分析和计算 | pip install pandas |
Networkx | 复杂网络和图结构的建模和分析 | pip install networkx |
PyQt5 | 基于Qt的专业级GUI开发框架 | pip install pyqt5 |
PyOpenGL | 多平台OpenGL开发接口 | pip install pyopengl |
PyPDF2 | PDF文件内容提取及处理 | pip install pypdf2 |
docopt | Python命令行解析 | pip install docopt |
PyGame | 简单小游戏开发框架 | pip install pygame |
#BatchInstall.py
import os
libs = {
"numpy","matplotlib","pillow","sklearn","requests",\
"jieba","beautifulsoup4","wheel","networkx","sympy",\
"pyinstaller","django","flask","werobot","pyqt5",\
"pandas","pyopengl","pypdf2","docopt","pygame"}
try:
for lib in libs:
os.system("pip install " + lib)
print("Successful")
except:
print("Failed Somehow")
自动化脚本+
方法论
实践能力
数据表示->数据清洗->数据统计->数据可视化->数据挖掘->人工智能
Numpy: 表达N维数组的最基础库
Matplotlib: 高质量的二维数据可视化功能库
Seaborn: 统计类数据可视化功能库
PyPDF2:用来处理pdf文件的工具集
http://mstamy2.github.io/PyPDF2
from PyPDF2 import PdfFileReader, PdfFileMerger
merger = PdfFileMerger()
input1 = open("document1.pdf", "rb")
input2 = open("document2.pdf", "rb")
merger.append(fileobj = input1, pages = (0,3))
merger.merge(position = 2, fileobj = input2, pages = (0,1))
output = open("document-output.pdf", "wb")
merger.write(output)
NLTK:自然语言文本处理第三方库
Python-docx:创建或更新Microsoft Word文件的第三方库
http://python-docx.readthedocs.io/en/latest/index.html
from docx import Document
document = Document()
document.add_heading('Document Title', 0)
p = document.add_paragraph('A plain paragraph having some ')
document.add_page_break()
document.save('demo.docx')
Scikit-learn:机器学习方法工具集
小议"函数式编程"
"函数式编程"用函数将程序组织起来,貌似很流行,为何不早学呢?
雷达图 Radar Chart
霍兰德人格分析
霍兰德人格分析雷达图
需求:雷达图方式验证霍兰德人格分析
输入:各职业人群结合兴趣的调研数据
输出:雷达图
通用雷达图绘制:matplotlib库 - 专业的多维数据表示:numpy库 - 输出:雷达图
#HollandRadarDraw
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family']='SimHei'
radar_labels = np.array(['研究型(I)','艺术型(A)','社会型(S)',\
'企业型(E)','常规型(C)','现实型(R)']) #雷达标签
nAttr = 6
data = np.array([[0.40, 0.32, 0.35, 0.30, 0.30, 0.88],
[0.85, 0.35, 0.30, 0.40, 0.40, 0.30],
[0.43, 0.89, 0.30, 0.28, 0.22, 0.30],
[0.30, 0.25, 0.48, 0.85, 0.45, 0.40],
[0.20, 0.38, 0.87, 0.45, 0.32, 0.28],
[0.34, 0.31, 0.38, 0.40, 0.92, 0.28]]) #数据值
data_labels = ('艺术家', '实验员', '工程师', '推销员', '社会工作者','记事员')
angles = np.linspace(0, 2*np.pi, nAttr, endpoint=False)
data = np.concatenate((data, [data[0]]))
angles = np.concatenate((angles, [angles[0]]))
fig = plt.figure(facecolor="white")
plt.subplot(111, polar=True)
plt.plot(angles,data,'o-', linewidth=1, alpha=0.2)
plt.fill(angles,data, alpha=0.25)
plt.thetagrids(angles*180/np.pi, radar_labels,frac = 1.2)
plt.figtext(0.52, 0.95, '霍兰德人格分析', ha='center', size=20)
legend = plt.legend(data_labels, loc=(0.94, 0.80), labelspacing=0.1)
plt.setp(legend.get_texts(), fontsize='large')
plt.grid(True)
plt.savefig('holland_radar.jpg')
plt.show()
运行结果:
报错
目标 + 沉浸 + 熟练
Requests: 最友好的网络爬虫功能库
Scrapy: 优秀的网络爬虫框架
pyspider: 强大的Web页面爬取系统
Beautiful Soup: HTML和XML的解析库
Re: 正则表达式解析和处理功能库
Python-Goose: 提取文章类型Web页面的功能库
from goose import Goose
url = 'http://www.elmundo.es/elmundo/2012/10/28/espana/1351388909.html'
g = Goose({
'use_meta_language': False, 'target_language':'es'})
article = g.extract(url=url)
article.cleaned_text[:150]
Django: 最流行的Web应用框架
Pyramid: 规模适中的Web应用框架
from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
def hello_world(request):
return Response('Hello World!')
if __name__ == '__main__':
with Configurator() as config:
config.add_route('hello', '/')
config.add_view(hello_world, route_name='hello')
app = config.make_wsgi_app()
server = make_server('0.0.0.0', 6543, app)
server.serve_forever()
Flask: Web应用开发微框架
WeRoBot: 微信公众号开发框架
import werobot
robot = werobot.WeRoBot(token='tokenhere') @robot.handler
def hello(message):
return 'Hello World!'
aip: 百度AI开放平台接口
从Web解析到网络空间
PyQt5: Qt开发框架的Python接口
PyGObject: 使用GTK+开发GUI的功能库
PyGame: 简单的游戏开发功能库
VR Zerot: 在树莓派上开发VR应用的Python库
Quads: 迭代的艺术
turtle: 海龟绘图体系
https://docs.python.org/3/library/turtle.html
从人机交互到艺术设计
https://python123.io
import turtle as t
t.penup()
t.seth(-90)
t.fd(160)
t.pendown()
t.pensize(20)
t.colormode(255)
for j in range(10):
t.speed(1000)
t.pencolor(25*j,5*j,15*j)
t.seth(130)
t.fd(220)
for i in range(23):
t.circle(-80,10)
t.seth(100)
for i in range (23):
t.circle(-80,10)
t.fd(220)
# RoseDraw.py
import turtle as t
# 定义一个曲线绘制函数
def DegreeCurve(n, r, d=1):
for i in range(n):
t.left(d)
t.circle(r, abs(d))
# 初始位置设定
s = 0.2 # size
t.setup(450*5*s, 750*5*s)
t.pencolor("black")
t.fillcolor("red")
t.speed(100)
t.penup()
t.goto(0, 900*s)
t.pendown()
# 绘制花朵形状
t.begin_fill()
t.circle(200*s,30)
DegreeCurve(60, 50*s)
t.circle(200*s,30)
DegreeCurve(4, 100*s)
t.circle(200*s,50)
DegreeCurve(50, 50*s)
t.circle(350*s,65)
DegreeCurve(40, 70*s)
t.circle(150*s,50)
DegreeCurve(20, 50*s, -1)
t.circle(400*s,60)
DegreeCurve(18, 50*s)
t.fd(250*s)
t.right(150)
t.circle(-500*s,12)
t.left(140)
t.circle(550*s,110)
t.left(27)
t.circle(650*s,100)
t.left(130)
t.circle(-300*s,20)
t.right(123)
t.circle(220*s,57)
t.end_fill()
# 绘制花枝形状
t.left(120)
t.fd(280*s)
t.left(115)
t.circle(300*s,33)
t.left(180)
t.circle(-300*s,33)
DegreeCurve(70, 225*s, -1)
t.circle(350*s,104)
t.left(90)
t.circle(200*s,105)
t.circle(-500*s,63)
t.penup()
t.goto(170*s,-30*s)
t.pendown()
t.left(160)
DegreeCurve(20, 2500*s)
DegreeCurve(220, 250*s, -1)
# 绘制一个绿色叶子
t.fillcolor('green')
t.penup()
t.goto(670*s,-180*s)
t.pendown()
t.right(140)
t.begin_fill()
t.circle(300*s,120)
t.left(60)
t.circle(300*s,120)
t.end_fill()
t.penup()
t.goto(180*s,-550*s)
t.pendown()
t.right(85)
t.circle(600*s,40)
# 绘制另一个绿色叶子
t.penup()
t.goto(-150*s,-1000*s)
t.pendown()
t.begin_fill()
t.rt(120)
t.circle(300*s,115)
t.left(75)
t.circle(300*s,100)
t.end_fill()
t.penup()
t.goto(430*s,-1070*s)
t.pendown()
t.right(30)
t.circle(-600*s,35)
t.done()
艺术之于编程,设计之于编程
编程不重要,思想才重要!
喜欢
全国计算机等级考试二级 Python科目
http://ncre.neea.edu.cn
全国计算机等级考试(简称NCRE)是教育部批准,由教育部考试中心主办,
面向社会,用于考查应试人员计算机应用知识与技能的全国性计算机水平考试体系。 二级Python语言科目在 2018年9月 首考,异常火爆,快去报名试试吧!