MOOC python

配套纯原创,转载请注明出处

C1、温度转换示例

#温度转换
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=eval(tempstr[0:-1])*1.8 + 32
    print("{:.2f}F".format(F))
else :
    print ("格式错误")
温度格式转换

 C2、turtle库图形绘制

#pythondraw.py
#具体见课程介绍,看三节约5min https://www.icourse163.org/learn/BIT-268001?tid=1206073223#/learn/content?type=detail&id=1210530388&cid=1212669666&replay=true
import turtle
turtle.setup(650,350,200,200)
    #turtle.setup(width,height,startx,starty) 后两项可选,为窗口左上角坐标
    
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()
pythondraw

1. 海龟绘图体系:turtle库简单应用

  1.1坐标体系

    turtle.setup(width, heigh, startx, starty) #x,y 是窗口左上角坐标,省略为居中

    turtle.goto(x,y) 

    turtle 默认在窗口中央,坐标为(0,0)  

  1.2海龟视角

    turtle.fd(d)//向前  turtle.bk(d)//向后  turtle.circle(r,angle)//

    turtle.seth(angle) // 设置海龟行进角度(绝对角度)

    turtle.left(angle)  turtle.right(angle) // 相对角度

  1.3 turtle.penup()  turtle.pendown() //  起落笔

    turtle.pencolor("purple")  turtle.pensize(25) // 笔画粗细

    turtle.done( ) // 停留需手动关闭窗口,若自动关闭则去了即可

2. RGB色彩体系  

3. import用法

    1, import turtle // turtle.fd(250)  2, form turtle import * // fd(250)

  3, import turtle as t // t.fd(250)

4. 循环语句

  4.1 遍历循环:

    for <循环变量> in <遍历结构>

      <语句块>   

    -每次循环,所获得元素放入循环变量,并执行一次语句块。

    -完整遍历所有元素后结束,下面是常用搭配。

  4.1.1 for <循环变量> in range (<参数>)  //循环变量:表示循环计数(0 ~ n-1)

        <循环体>           //参数:循环次数

  4.1.2  range( ) 函数:产生序列

    range (5) 产生:0,1,2,3,4

    range(2,5) 产生 : 2,3,4

    range(1,6,2)产生:1,3,5  //2为步长

  4.1.3 字符串循环:

    for c in s :    #s是字符串,遍历其每个字符给c,产生循环。

     <语句块>

  4.1.4 列表遍历循环:

    for item  in  ls :  #ls 是一个列表,遍历每一个元素给item,产生循环。

      <语句块>

    for item in [123,"py",456] :

      print(item,end=",")  

    # output : 123,py,456,

  4.1.5 文件遍历循环:

    for line in fi :  #循环输出文件的每一行

      print(line)

  4.2  无限循环:

    while <条件>  :

      <语句块>

  4.3 break:跳出并结束当前循环,执行循环后的语句

    continue: 结束当次循环,继续执行后续次数循环

  4.4 循环 & else

      循环后加一个else语句可看作循环正常执行完的 “奖励语句” ,如果循环直到结束都没有碰到 break 而强制退出,则执行接下来的else语句。

       while <条件>  :

      <语句块1>

       else :

      <语句块2>

        

C3、数字类型操作

1. 整数类型无限范围及4种进制表示:0x,0d,0o,0b。

2. 浮点类型近似无限范围、小数位数及科学计数法。

  0.1+0.2==0.3  False

  round(0.1+0.2)==0.3  Ture

  round(x [,d]) : 对x进行四舍五入,保留d位小数,不加d为取整

3. +、-、*、/、//、%、**、及其增强操作符

4. 函数:abs()divmod()pow(x, y [,z]),round()max()min()

 强制类型转换:int("123")float()complex()

 

C4、控制结构

#BMI.py
height,weight=eval(input("输入身高m体重kg(逗号隔开):"))
bmi=weight/pow(height,2)
print ("BMI is {:.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 : 国标'{}',国内'{}'".format(who,nat))
#BMI.py

 

1. if else elif

1)if < 条件>:      2)<表达式1> if <条件> else <表达式2>

    <语句块1>       如果条件为true执行表达式1否则执行表达式2

       else :          注意此处只能放表达式而不能是语句,不能有‘=’

    < 语句块2 >

 

2 字符串format填充函数

   "{} {}".format("hello", "world") # 不设置指定位置,按默认顺序   'hello world'

   "{1} {0} {1}".format("hello", "world") # 设置指定位置     'world hello world'

   print("网站名:{name}, 地址 {url}".format(name="菜鸟教程", url="www.runoob.com"))

 

3. 与或非:x and y  x or y  not x

4. 异常处理

 1) try :                  #例 :  try : 

     <语句块1>                   num=eval(input("请输入一整数"))

   except :                    print(num**2)

     <语句块2>               except :

   执行语句块1,如果出错执行语句块2         print("输入非整数")

 

 2) try :

     <语句块1>

   except <异常类型1>:

     <语句块2>

   执行语句块1,如果出错出错类型为异常类型1则执行语句块2

 

C5、字符串操作

5.1字符串切片

  -字符串[开始索引:结束索引:步长]
  -切取字符串为开始索引到结束索引-1内的字符串
  -步长不指定时步长为1 字符串[开始索引:结束索引]

  例1:s="hikvision"    #把第五个字符后面的字符串全扔掉,

      s=s[ : 5 ]       #此时s=“hikvi”, s[:9]=s[:-1]="hikvisio"

  例2:s[: : -1] #将s字符串从开始到结束采用-1为步长输出,即字符串反转。 

5.2字符串常用函数

  

   +  *  len()  str()  oct()  ord()  chr()

  .lower()  .upper()    .count()  

  .center()   .strip()    .format()

.replace():把字符串中的 旧字符串替换成新字符串,若指定第三个参数max,则替换不超过 max 次。格式:str.replace(old, new[, max])
.split():通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串,返回分割后的字符串列表。
格式:str.split(str="", num=string.count(str))
.join():用于将序列中的元素以指定的字符连接生成一个新的字符串。返回通过指定字符连接序列中元素后生成的新字符串。

格式:str.join(sequence)  #sequence -- 要连接的元素序列。

例:str = "-";
  seq = ("a", "b", "c"); # 字符串序列
  print str.join( seq );得:a-b-c

 

 

C6、random库使用

#蒙地卡罗求pi法
from random import random #仅导入库中random一个函数
from time import perf_counter
DARTS=10000*10000#飞镖个数
hits=0.0
start=perf_counter()#当前系统时间,表示计时开始
for i in range(DARTS+1):
        x,y=random(),random()
        dist=pow(x**2+y**2,0.5)
        if dist<=1.0:
                hits+=1
pi=4*(hits/DARTS)
print ("pi={}".format(pi))
print ("运行时间:{}".format(perf_counter()-start))
#蒙地卡罗求pi法.py

   Ps:善用perf_counter()-start来查看某段代码运行时间。

6.1.基本随机数(伪)函数:

  seed( ): 初始化随机种子,random.seed(10) #以种子10对应的随机序列

  种子相同,产生随机数序列也相同,若不用此函数,默认种子为当前时间(微秒级)。

  random( ): 生成一个[0,1)之间的随机小数

  >>>random.random( )  #0.87463423472983423 

 

6.2.扩展随机数函数:

  randint(a,b):产生[a,b]之间的整数。>>>random.randint(10,100)

  getrandbits(k): 产生一个k比特长的随机整数

  uniform(a,b): 产生一个[a,b]之间的随机小数 #浮点数有16位精度,故产生16位小数。

  choice(seq): 从序列seq中随机选择一个元素。>>>random.choice([1,2,3,4,5])

  shuffle(seq): 打乱seq排列,并返回之

 

C7、函数&代码复用

7.1.定义方式:函数自def始,至return终

7.1.1 def <函数名> (<参数>):  or   def <函数名> (<参数>,<可选参数>):

         <函数体>                <函数体>

         return<返回值>                 return<返回值>

        调用:a= fact(10) 、 a=fact(10,5)、 a=fact(m=5,n=10).

      位置对应和名称对应都可

 

def fact(n,m=1)
    s=1
    for i in range(1,n+1)
        s*=i
        return s // m
#若不设m,默认m=1,返回n!,设返回n!整除m
例子:计算n! // m

    也可用return返回多个值,如上例改成 return s//m ,n , m

  则fact(10, 5)会返回元组:(725760,10,5)

  如 :a,b,c = fact(10,5 )这样赋值也是合法的

7.1.2 不确定数量参数传递

    def <函数名> (<参数1>, *b) : #参数1是必有的参数,b为其余不确定参数  

        <函数体>            

      return<返回值>

7.2. 局部变量和全局变量(区别:函数内部使用&全局使用)

7.2.1 规则:

  -局部变量是函数内部占位符,可与全局变量重名但不相同。

  -函数运算结束后,局部变量被释放。

  -可使用 global 关键字再函数内部使用全局变量。

  -局部变量为 ①组合数据类型 且 ②不是在函数内部定义的,则它等同全局变量。

n,s=10,100
def fact(n) :
    global s    #此s为全局s,它改外部s也改
    s*=i
    return s
print(fact(n),s)
#1000,1000
test1.py

 

7.3. lambda函数(匿名函数)

一种定义函数的简单方式,常用于定义某些参数,一般用 def-return 形式。

用例:

  >>> f = lambda x , y : x+y    #函数名:f   参数:x,y  表达式:x+y

  >>>f(10 , 15)

  25

  >>>f = lambda : "lambda 函数"  #也可以没有参数

  >>>print (f())

  lambda函数

7.4.实例:七段数码管绘制

step:

  1-绘制单个数字对应数码管

   原理:数码管‘8’可由一笔化成,控制pen的起落,可画all。

  2-获得一串数字,绘制其对应的数码管

  3-获取当前系统时间,绘制对应数码管 

import turtle
def drawLine(draw):  #绘制单段数码管
    turtle.pendown() if draw else turtle.penup()
    turtle.fd(40)
    turtle.right(90)

def drawDigit(digit):#根据数字绘制数码管
    drawLine(1) if digit in [2,3,4,5,6,8,9] else drawLine(0)  #第1笔
    drawLine(1) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(0)#第2笔
    drawLine(1) if digit in [0,2,3,5,6,8,9] else drawLine(0)    #第3笔
    drawLine(1) if digit in [0,2,6,8] else drawLine(0)          #第4笔
    turtle.left(90)     
    drawLine(1) if digit in [0,4,5,6,8,9] else drawLine(0)      #第5笔
    drawLine(1) if digit in [0,2,3,5,6,7,8,9] else drawLine(0)  #第6笔
    drawLine(1) if digit in [0,1,2,3,4,7,8,9] else drawLine(0)  #第7笔
    turtle.left(180)  #归位乌龟方向
    turtle.penup()
    turtle.fd(20)

def drawData(data):   #转字符串为数字并调用drawDigit画出
    for i in data:
        drawDigit(eval(i))

def main():
    turtle.penup()
    turtle.fd(-300)
    turtle.pensize(5)
    
    drawData("20210817")
    turtle.done()

main()#运行
数码管绘制
import turtle
import datetime

curr_time=datetime.datetime.now()
time_str = datetime.datetime.strftime(curr_time,'%Y%m%d')#指定输出格式并转成字符串类型

def drawLine(draw):  #绘制单段数码管
    turtle.penup()
    turtle.fd(5)        #分段显示
    turtle.pendown() if draw else turtle.penup()
    turtle.fd(35)
    turtle.penup()
    turtle.fd(5)        #分段显示
    turtle.right(90)

def drawDigit(digit):#根据数字绘制数码管
    drawLine(1) if digit in [2,3,4,5,6,8,9] else drawLine(0)  #第1笔
    drawLine(1) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(0)#第2笔
    drawLine(1) if digit in [0,2,3,5,6,8,9] else drawLine(0)    #第3笔
    drawLine(1) if digit in [0,2,6,8] else drawLine(0)          #第4笔
    turtle.left(90)     
    drawLine(1) if digit in [0,4,5,6,8,9] else drawLine(0)      #第5笔
    drawLine(1) if digit in [0,2,3,5,6,7,8,9] else drawLine(0)  #第6笔
    drawLine(1) if digit in [0,1,2,3,4,7,8,9] else drawLine(0)  #第7笔
    turtle.left(180)  #归位乌龟方向
    turtle.penup()
    turtle.fd(20)

def drawData(data):   #转字符串为数字并调用drawDigit画出
    for i in data:
        drawDigit(eval(i))

def main():
    turtle.penup()
    turtle.fd(-300)
    turtle.pensize(5)
    
    drawData(time_str)
    turtle.done()


main()#运行
    

数码管绘制
数码管plus

 总结:函数降低编码方式:模块化思维,大功能化小功能,分而治之。

 7.5.代码复用&函数递归

 7.5.1 代码复用(模块化)思想

  紧耦合:两部分之间交流很多,无法独立存在。

  松耦合:两部分之间交流较少,可以独立存在。

  函数的输入参数与返回值即其与其他代码交流通道,通道越少则越清晰,复用的可能性就越高。故希望模块内部紧耦合,便于传输;模块之间松耦合,提高复用。

7.5.2 递归:函数定义中调用函数自身。

  -思想:函数+分支

  -链条:计算过程中存在递归链条。

  -基例:存在一个或多个不需递归的基础例子。

  -实际上执行递归操作时python在不断地开辟内存给链条,执行到基例才一并返回。我们只关心从 n 到 n-1 该怎么实现,从n-1到基例我们不关心。

7.6 PyInstaller 库基本介绍

作用:将.py源代码转换成无需源代码的可执行文件(在没有python解释器环境下也能运行)

Pyinstaller是一个第三方库(解释器安装过程中并不预先安装的库),需要pip安装之。

在cmd命令行下输入 : pyinstaller -F <文件名.py>  则会在目录下生成.exe可执行文件

7.7 实例:科赫雪花小包裹

7.7.1:科赫曲线:将一段直线“---”变成“ -^- ”称为一次科赫变换。科赫雪花将三条科赫曲线    拼接一起即可。

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)     #对1/3长度进行n-1阶科赫化

def main():
    turtle.speed(0)
    turtle.setup(800,400)
    turtle.penup()
    turtle.goto(-300,-50)
    turtle.pendown()
    turtle.pensize(3)
    koch(600,4)
    turtle.hideturtle()
main()
科赫曲线
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)     #对1/3长度进行n-1阶科赫化

def main():
    turtle.speed(0)#设置绘制速度最快
    turtle.setup(1000,1000,100,0)
    turtle.penup()
    turtle.goto(-350,175)
    turtle.pendown()
    turtle.pensize(1)
    koch(600,3)
    turtle.right(120)
    koch(600,3)
    turtle.right(120)
    koch(600,3)
    turtle.hideturtle()
main()
科赫雪花

 7.7.2:利用Pyinstaller打包雪花绘制小程序(8.24上班弄)

  pip install Pyinstaller后,准备一个.ico的图标文件,cmd中

7.7.3 科特雪花举一反三

 

C8、 组合数据类型(用恰当的类型表达一组数据以便操作)

- 8.1 集合类型及操作
- 8.2 序列类型及操作(元组&列表)
- 8.3 实例9: 基本统计值计算
- 8.4 字典类型及操作
- 8.5 模块5: jieba库的使用
- 8.6 实例10: 文本词频统计
C8目录

8.1集合类型及操作

8.1.1集合定义

-集合类型于数学集合概念一致

-集合元素 无序,唯一,为不可变数据类型(如整数,复数,字符串,元组类型等)

-集合用{}表示,中间逗号分隔。

-建立集合用set()或{},空集合必须用set()

>>>A={"python",123,("python",123)}  #使用{}建立集合

>>>B=set{"pypy123"}  #使用set建立集合得{'1','p','2','3','y'}

>>>C={"python",123,"python",123}  #得{"python",123},自动去重复

 

8.1.2集合操作

1)操作符:

  S|T  并集    S,T中都有元素

  S-T  差集    S有T没有   

  S&T   交集  S,T都有  

  S^T    补集  S,T中非相同元素

  S<=T/S<T         判断S,T的子集关系,返回bool值

  S>=T/S>T    判断S,T的包含关系,返回bool值

  PS:提供增强操作符以修改原有集合

2) 操作函数

  S.add(x)      若 x 不在S中,增加x至S

  S.discard(x)      移除S中x元素,若x不在S中不报错

  S.remove(x)      同上,但x不在S中产生KeyError异常(可用try捕捉)

  S.clear()          清空S

  S.pop()         随机取出一个元素,并更新S,若S为空,返回KeyError异常

  S.copy()       返回S的副本

  len(S)        返回S元素个数

  x in S/x not in S   判断x是否在S中,返回bool值

8.1.3 集合应用场景

  1.数据去重

    >>>ls = ['p','p','y','y','y',123]

    >>>s=set(ls)

    {'p','y',123}

    >>>lt = list(s)     # 列表去重

    ['p','y',123]

  2.包含关系的比较

 

8.2序列类型及操作

8.2.1序列定义

  -序列是具有先后关系的一组元素,元素类型可不相同

  -可由下标访问特定元素

  -是基类类型(字符串,元组,列表类型都是序列类型衍生)

8.2.2序列操作

1)6个操作符

  x in s/ x not in s   返回bool值

  s + t          链接两序列

  s*n          将序列s复制n次

  s [i]          返回s中第i给元素

  s[ i : j [: k] ]      切片,返回序列s中第i到j以k为步长的元素子序列,k=1默认

2)5个函数方法

  len(s)       返回s长度      

  min(s)/max(s)    当s同类型时,返回最值,否则报错

  s.index(x [,i, j])   返回序列s从 i 到 j 位置中第一次出现x的位置(下标)。

  s.count(x)     返回x出现次数

  

8.3 元组类型及操作

  定义:

    -元组类型就是将元素进行有序排列

    -元组是一种序列类型,一旦创建就不能修改

    -使用 () 或tuple()创建,元素间用逗号分隔

    -可以不用()也表示元组 

  操作:继承所有序列操作

  应用场景:

    -多用于固定搭配,元素不改变

    -数据保护,定义后数据就不再改变    

8.4列表类型及操作

  定义:

    -列表是一种序列类型,创建后可随意修改

    -使用 [ ] 或 list() 创建

    -若非创建列表而使用赋值 ls1= ls2,实际上并没有创建新列表,而是重命名ls1(指针)

  操作:

     ls[i] = x    替换 ls 第 i 元素为x

     ls[i :j :k]=lt     用lt替换ls切片后所对应的子序列    

     del ls[i]     删除第i元素

     del ls[i :j : k]   删除第 i 到第 j 以 k 为步长的元素

     ls += lt      更新ls,将lt元素增加到ls中

     ls *= n       更新ls,使其元素重复n次

  函数:

     ls.append(x)     在列表最后加一个元素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( )     反转列表

  应用场景:最常用

  实例9:基本统计值(总个数,求和,平均值,方差,中位数...)

8.5字典类型及操作

  定义:

    -映射:键(索引)和值(数据)的对应,字典是映射的体现 

    -字典是键值对的集合,键值对之间无序

    -采用{ } 和dict()创建,键值对用:表示

    -{<key>:<value>,<k>:<v>...<k>:<v>}

    -生成空字典:de={}(前面说空集合不能用{ }生成,就是因为这个)

      >>>d = {"中国":"北京","美国":"华盛顿","俄罗斯":"莫斯科"}

      >>>d["中国"]

      ‘北京'

  操作:

    del d[k]    删除字典d中键k对应的数据值

    k in d       判断键k是否在字典d中,返回bool

       d.keys()     返回字典d中所有键信息

    d.values()     返回字典d中所有值信息

    d.items()    返回字典d所有键值对信息

    d.get(k , <default>)    键k存在,返回其对应值,否则返回<defult>值

    d.pop(k , <default>)      键k存在,取出其对应值,否则返回<defult>值

    d.popitem()         随机从字典d中取一个键值对,以元组形式返回

    d.clear()         清空字典d

    len(d)           返回d中元素个数

8.6 jieba库的使用

  -第三方中文分词库,根据中文组合概率为依据来对中文分词

  -jieba分词三种模式:精确模式,全模式,搜索引擎模式

  常用函数:

    jeiba.lcut(s)         精确模式,返回一个列表的分词结果

      >>>jieba.lcut("中国是一个伟大的国家")

      ['中国','是','一个','伟大','的','国家']

    jieba.lcut(s,cut_all=Ture)    全模式,存在冗余

    jieba.lcut_for_search(s)   搜索引擎模式,详百度之

    jieba.add_word(w)      向分词词典加入新词

      >>>jieba.add_word("海康威视")

8.7 实例10:文本词频统计(待)

 

C9、文件与数据格式化(会编写带文件输入输出的程序)

9.1 文件的使用
9.2 实例11:自动轨迹绘制
9.3 一维数据的格式化和处理
9.4 二维数据的格式化和处理
9.5 模块6:wordcloud库的使用
9.6 实例12:政府工作报告词云
C9目录

9.1 文件的使用

9.1.1 文件的类型: 文本文件 & 二进制文件

  ps:本质都是二进制文件,只是展示方式不同

  

#文本形式打开文件
tf = open("f.txt","rt",encoding="utf-8")#以文本/二进制格式(tr/tb)输出文件,
                #不说明编码格式会报错
print(tf.readline())
tf.close()

 
 文本形式打开文件

9.1.2 文件的操作步骤:打开-操作-关闭

    通过open和close改变文件状态(储存状态 & 占用状态)

     <变量名> = open(<文件名>, <打开模式>)  #文件名包括文件路径和名称(源文件同目录可省略),打开模式为 读 OR 写

  文件的打开模式:

  

  f = open("f.txt")      -默认值:文本模式&只读模式

  f = open("f.txt", "rt")    -同默认值

  f = open("f.txt", "w")    -文本覆盖写

  f = open("f.txt", "a+")     -文本追加写&读写文件

  文件的关闭:  <变量名>.close()

9.1.3 文件的读取

  <f>.read(size = -1)     读入全部内容,若给出参数读入前size长度。

    例:>>>s = f.read(2)

       中国 

  <f>.readline(size = 1)    读入一行内容,如给出参数,读入该行(指针所指行)前size长度

    例:>>>s = f.readline()

        中国是一个伟大的国家 

  <f>.readlines(hint = -1)    读入文件所有行,以每行为元素形成列表,给出参数则读入前hint行

  

文件的遍历:  

  法一:一次读入,统一当字符串处理

1 fname = input("请输入要打开的文件:")
2 fo = open(fname, "r")
3 txt = fo.read()  #对全文txt处理
4 fo.close()   

  法二:按数量读入逐步处理

1 fname = input ("请输入要打开的文件:")
2 fo = open(fname,"r")
3 txt = fo.read(2)  #从文件中读入两个字节
4 while txt != "" :
5     txt = fo.read(2)    #对txt进行处理
6 fo.close()        

   法三:逐行遍历文件1

1 fname = input("输入要打开的文件:")
2 fo = open(fname,"r")
3 for line in fo.readlines():
4     print(line)
5 fo.close

9.1.4 数据文件的写入

  <f>.write(s)      向文件写入字符串

             >>>f.write("中国是一个伟大的国家")

  <f>.writelines(lines)  将一个元素全为字符串的列表写入文件

               >>>ls = ["中国", "法国", "美国"]

               >>>f.writelines(ls)  中国法国美国   #PS:元素间直接拼接不换行 

  <f>.seek(offset)    offset=0,1,2分别代表:指针指向0文件开头、1当前位置、2文件结尾

 

例子:

fo = open("output.txt", "w+")
ls = ["zg","fg","mg"]
fo.writelines(ls)

fo.seek(0)   #如果不加这一句,程序将什么都输出不来,因为写之后指针自        
             #动向后加一,处于最后面,读取会往后读取,故需置前指针。 

for line in fo:
    print (line)
fo.close()                                       

 

9.2:实例11:自动轨迹绘制

  与turtle不同:读取数据根据数据画出图形

  读取文件---解析数据---绘制图形

  step1:定义接口(数据挖掘格式,即一种规范)

    如:300,0,144,1,0,0  (行进距离,左右转向,转向角度,线条颜色rgb)

#autoTraceDraw.py

import turtle as t
#初始化
t.title('自动轨迹绘制')
t.setup(800,600,0,0)
t.pencolor("red")
t.pensize(5)
#数据读取
datals = []
f = open("autoTraceDrawdata.txt")
for line in f:  #这里拿到的是字符串
    line = line.replace("\n","")
    datals.append(list(map(eval,line.split(","))))
    #split:通过指定分隔符对字符串进行切片,这里是通过","分割,返回的是字符串列表
    #map:把第二个参数的所有元素都执行一次第一个参数所对应的函数。
    #故line由 字符串—>拆分并变换成列表—>数值—>数值列表—>拼接到datals
f.close()
#解析数据,自动绘制
for i in range(len(datals)):
    t,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[1][2])
autoTraceDraw

   举一反三:

     -数据与功能分离,数据驱动的自动运行

    -接口化设计

    -应用维度组织数据,二维为最常用

 

9.3 一维数据的格式化和处理

  数据三阶段:存储(空格或者特殊字符分开)--表示--操作(即算法)

  9.3.1 一维数据的表示:列表(最常用),集合(无序数据)

#一维数据的读入处理:将数据处理成列表
#如:中国 美国 英国 法国 俄国
#以空格分隔
txt = open(fname).read()
ls = txt.split()
f.close()

>>>ls
['中国','美国','英国','法国','俄国',]
#采用空格方式将数据写入文件
ls = ['中国','日本','韩国']
f = open(fname,'w')
f.write(' '.join(ls))
#join:将join前面的字符串分隔放置到join后面参数的各个元素之间。
f.close()

 

9.4二维数据的格式化和处理

  9.4.1 二维数据的表示:统统使用二维列表:其每个元素都是一个列表

    -CSV数据:国际通用的一、二维数据存储格式,文件以 .csv后缀

     每行一个一维数据,采用逗号分隔,无空行,不同行即不同维度

     excel和一般软件都可读入或另存为csv文件。

  9.4.2 二维数据的处理

#1、从csv格式文件中读入数据
fo = open(fname)
ls = []
for line in fo :
    line = line.replace("\n","")
    ls.append(line.split(","))#将元素按逗号分割开形成列表,并加入ls列表中
fo.close()

 

#2、将数据写入csv格式的文件
ls = [ [], [], [] ]#二维列表
f = open(fname,'w')
for item in ls:
    f.write(',' . join(item)+'\n')
    #join:将join前面的字符串分隔放置到join后面参数的各个元素之间再加个回车
f.close()

  9.4.3 二维数据遍历:双for循环。

 

9.5 模块6:wordcloud库使用

  词云:就是艺术性文字可视化展示

  前提:pip install wordcloud

  9.5.1 使用说明

  wordcloud 库把词云当成一个 WordCloud 对象

  -可根据词语出现频率等参数绘制图云

  -可设置词云尺寸颜色形状等参数

  w.generate(txt)     向wordcould对象w中加载文本txt

    >>>w.generate("Python and WordCould")

  w.to_file(filename)   将词云输出为图像文件,png或jpg格式

    >>>w.to_file("outfile.png") 

  9.5.2 绘制一个词云图片

  步骤:1、▲配置对象参数----2、加载词云文本---3、输出图片文件(程序同目录)

#最简单词云例子
import wordcloud
c = wordcloud.WordCloud()    #创建词云对象
c = generate("wordcloud by pythnon")    #加载文本        
c.to_file("pywordcloud.png")    #输出文件

      词云库进行的工作:
   -分隔:以空格分隔单词
   -统计&过滤:字体大小的依据,仅有一两个的单词过滤掉
   -字体:根据统计配置字号
   -布局:颜色环境尺寸
    配置对象参数
  w = wordcloud.WordCloud(<参数>)
  配置词云图片大小:
  w = wordcloud.WordCloud(width=600)
  w = wordcloud.WordCloud(height=400)
  ps:不设定默认width,height=400,200
  配置词云字号:
  w = wordcloud.WordCloud(min_font_size=10)  
  w = wordcloud.WordCloud(max_font_size=20)
  #设置最大和最小字号
  
  w = wordcloud.WordCloud(font_step=2)
  #设置字号变大的步进间隔,默认为1
  
  w = wordcloud.WordCloud(font_path="myth.ttc")
  #指定字体文件路径,默认None

  w = wordcloud.WordCloud(max_words=20)
  #词云只放二十个词语
  
  w = wordcloud.WordCloud(stop_words={"PYTHON"})
  #设置词云屏蔽的词语

  w = wordcloud.WordCloud(background_color="white")
  #更改图片背景颜色默认黑色
  mask函数 :指定词云形状卡卡西形(默认是矩形)

PS:词云库是以空格作为分隔的,故对于中文分词要先进性jieba库分词操作。

import jieba
import wordcloud
txt = "硅基光电集成被认为解决微电子发展难题的一支很有潜力的方\
向,对它的研究也进行了很长时间。限制其发展的最大障碍便是\
至今没有合适的材料可作为硅基光源,本论文针对硅基光源这一\
方向,对掺铒富硅氮氧化硅的敏化发光进行了探究,对掺铒硅基\
发光材料的研究有一定的参考价值和重要意义。"
w = wordcloud.WordCloud(width=5000,\
font_path="msyh.ttc",height=3000)
w.generate(" ".join(jieba.lcut(txt)))
w.to_file("1.jpg")    #输出文件
中文词云例

9.6 实例12:政府工作报告词云

  基本思路:读取文件,分词整理—>设置并输出词云—>观测结果,迭代优化

#GovRptWordCloud.py
import jieba
import wordcloud
f=open("中共中央国务院关于实施乡村振兴战略的意见.txt","r",encoding="utf-8")   #打开文本
exclude={'我们','你们','他们','它们','因为','因而','所以','如果','那么',\
          '如此','只是','但是','就是','这是','那是','而是','而且','虽然',\
          '这些','有些','然后','已经','于是','一种','一个','一样','时候',\
    '没有','什么','这样','这种','这里','不会','一些','这个','仍然','不是',\
    '自己','知道','可以','看到','那儿','问题','一会儿','一点','现在','两个',\
         '三个','','',''}    #屏蔽词       
t=f.read()  #将文本内容一次性读入t
f.close()
ls=jieba.lcut(t)    #将分词内容保存为列表ls
txt=" ".join(ls)     #词云库的处理要求是以空格分割的长文本,故用空格链接ls形成长字符串txt
w=wordcloud.WordCloud(font_path="msyh.ttc",width=2000,\
height=1400,background_color="white",stopwords=exclude)   #词云设置
w.generate(txt)    #加载文本
w.to_file("GovRpt.png")
GovRptWordCloud.py
import jieba
import wordcloud
f=open("停用词.txt","r",encoding="utf-8")
t=f.read()
f.close()
t.replace("\n"," ")
a=jieba.lcut(t)
exclude=set(a)

f=open("掺铒富硅氮氧化硅的敏化发光研究_徐凌波.txt","r",encoding="utf-8")   #打开文本
    
t=f.read()  #将文本内容一次性读入
f.close()
ls=jieba.lcut(t)    #将分词内容保存为列表ls
txt=" ".join(ls)     #词云库的处理要求是以空格分割的长文本,故用空格链接ls形成长字符串txt
w=wordcloud.WordCloud(font_path="msyh.ttc",width=2000,\
height=1400,background_color="white",stopwords=exclude)   #词云设置
w.generate(txt)    #加载文本
w.to_file("1.png")
徐灵波博士论文.py

  tip:如果报错要把txt另存为一下,保存为utf-8格式

C10、python程序设计

 

10.1 实例13:体育竞技分析
10.2 python程序设计思维
10.3 python第三方库安装
10.4 模块7:os库的基本使用
10.5 实例14:第三方库自动安装脚本
C10目录

 

10.1 体育竞技分析

  思想:抽象+自动化:抽象比赛为某过程,自动执行N场比赛。

  10.1.1 自顶向下&自底向上

    自顶向下(设计):将总问题分解为若干小问题,可将小问题再分解,直到 小问题可以被计算机简单明了的解决(分而治之)

    自底向上(执行):逐步组建复杂系统的测试方法(模块化集成)

10.4 模块7:os库的使用

  10.4.1 os库介绍:与操作系统交互的库(win 、macOS、 Linux)

      os库提供通用的基本的操作系统交互功能

      -路径操作:os.path子库,处理文件路径及信息

      -进程管理:启动系统中其他程序

      -环境参数:获得系统软硬件信息等环境参数

  10.4.2 路径操作

    首先:import os.path

    os.path.abspath(file)    返回file在当前系统中的绝对路径

                  >>>os.path.abspath("file.txt")

                  'C:\\Users\\file.txt'  

    os.path.getsize(file)      返回file对应文件的大小,以字节为单位

    os.path.exists(file)      判断file是否存在,返回布尔值

    os.path.isfile(file)      判断file是否为已存在的文件,返回布尔值

    os.path.isdir(file)      判断file是否为已存在的目录,返回布尔值

    os.path.get[a/m/c]time(file)   返回文件上一次访问/修改/创建时间。

  10.4.3 进程管理

      实质:使用我们的python程序,调用外部程序

      os.system(command)

        -执行程序或命令command

        -win中,返回值是cmd的调用返回信息

      例如: import os

          os.system("C:\\Windows\\System32\\calc.exe")

             #相当于直接在cmd里直接运行这行命令,调用并运行计数器(打开计算机)返回0表示运行正常

          os.system("C:\\Windows\\System32\\mspaint.exe C:\\Users\\szr\\AppData\\Local\\Programs\\Python\\Python38-32\\GovRpt.png")

          #运行画图并打开图片

  10.4.4 环境参数:获取和改变系统环境信息

      os.chdir(file)    修改当前程序的路径

      os.getcwd()      返回程序当前目录

10.5 实例14:自动化安装第三方库

  提供更多写自动化python脚本的思路

import os
libs={"jieba","pillow","requests","wheel","pyqt5"}

try:
    for lib in libs:
        os.system("pip install"+lib)
    print("successful")
except:
    print("error")

#对写自动化脚本提供了新的思路
BatchInstall.py

 

      

    

  

 

 

  

  
  
    

  

 

    

 

posted @ 2021-08-08 17:25  蓄芳  阅读(244)  评论(0)    收藏  举报