Python语言程序设计(北京理工大学MOOC)6-8周

第六周

数据基本处理源程序

def get_num():
    num = []
    numstr = input("请输入数字,回车键结束:")
    while numstr != "":
        num.append(eval(numstr))
        numstr = input("请输入数字,回车键结束:")
    return num
# 求平均值
def mean(num):
    sum = 0.0
    for number in num:
        sum += number
    return sum/len(num)
#求中位数
def median(num):
    sorted(num)
    size = len(num)
    if size%2 ==0:
        med = (num[size//2-1] + num[size//2])/2
    else:
        med = num[size//2]
    return med
#求方差
def dev(num,med):
    sdev = 0.0
    for number in num:
        sdev = sdev + (number - med)**2
    return pow(sdev/(len(num)-1), 0.5)


n = get_num()
m = mean(n)
d = dev(n, m)
print("平均值为{:.2f},中位数为:{},方差为:{:.2f}".format(m, median(n), d))

  1. 集合特点
    -集合用大括号{}表示,元素间用逗号分离
    -集合中每一个元素位移,不存在相同元素
    -集合元素之间无序
  2. 集合的操作方法
    四个操作符
    在这里插入图片描述
    再加上两个关系操作符
    是S<=T或S<T 返回True/False,判断S和T的子集关系
    是S>=T或S>T 返回True/False,判断S和T的包含关系
    还有四个增强操作符
    在这里插入图片描述
    |操作函数或方法|描述 |
    |–|--|
    | S.add(x) | 如果x不在集合中则将x增加到S |
    | S.discard(x) | 移除S中元素x,如果x不在集合S中,不报错 |
    | S.remove(x) | 移除S中元素x,如果x不在集合S中,产生KeyError异常|
    | S.clear(x) | 移除S中所有元素 |
    | S.pop(x) | 随机返回S的一个元素,更新S,若S为空产生KeyError异常 |
    在这里插入图片描述
    经典用法:数据去重

    ls = [‘P’, ‘Y’, ‘P’, ‘Y’, 123]
    s = set(ls)
    lt = list(s)
    输出 [‘P’, ‘Y’, 123]

  3. jieba库
    jieba是优秀的中文分词第三方库,需要额外安装
    jieba库提供三种分词模式,最简单只需掌握一个函数
    jieba分词的原理
    Jieba分词依靠中文词库
    利用一个中文词库,确定汉字之间的关联概率
    汉字间概率大的组成词组,形成分词结果
    除了分词,用户还可以添加自定义的词组
    最常用的就是:
    jieba.lcut(s) :精确模式,返回一个列表类型的分词结果
    jieba.lcut(“中国是一个伟大的国家”)
    [‘中国’, ‘是’, ‘一个’, ‘伟大’, ‘的’, ‘国家’]

寻找哈姆雷特高频词汇源程序

def getText():
    txt = open("hamlet.txt", "r").read()# 打开文件
    txt = txt.lower()# 全部转化为小写字母
    for i in '!#$%^&*()_-+=/`~{}[]:;"?<>,.':#去掉全部标点符号用空格代替
        txt = txt.replace(i, " ")
    return txt

hamletTxt = getText()
words = hamletTxt.split()# split 默认用空格将字符串分隔并以列表形式返回
counts = {}
for i in words:
    # 计算单词出现的次数,get函数就是寻找i这个键,如果在字典中找到了就返回对应的值,后面那个参数就是default值
    counts[i] = counts.get(i, 0) + 1
# item函数即以列表返回可遍历的(键, 值) 元组数组([key:value],[key:value],[key:value])
# 再次使用list函数将元祖转化为列表
items = list(counts.items())
#对列表按照键值对的第二个元素进行从大到小的排列
items.sort(key=lambda x:x[1], reverse=True)
for i in range(10):
    word, count = items[i]
    print("{:10}{:5}".format(word, count))#{:10}指定了该域的宽度为10,避免单词与次数打印效果重复

寻找三国演义人物出场次数源程序

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 == "孔明曰":
        reword = "孔明"
    elif word == "关公" or word == "云长":
        reword = "关羽"
    elif word == "玄德" or word == "玄德曰":
        reword = "刘备"
    elif word == "孟德" or word == "丞相":
        reword = "曹操"
    else:
        reword = word
    # 计算单词出现的次数,get函数就是寻找i这个键,如果在字典中找到了就返回对应的值
    counts[reword] = counts.get(reword, 0) + 1
for word in excludes:
   del counts[word]
# item函数即以列表返回可遍历的(键, 值) 元组数组([key:value],[key:value],[key:value])
# 再次使用list函数将元祖转化为列表
items = list(counts.items())
#对列表按照键值对的第二个元素进行从大到小的排列
items.sort(key=lambda x:x[1], reverse=True)
for i in range(10):
    word, count = items[i]
    print("{:10}{:5}".format(word, count))# {:10}指定了该域的宽度为10
    

明明已经下载jieba库但是pycha提示没找到怎么办?
file-settings-project-project interpreter,找到右边的绿色加号,把jieba添加进来就可以了

提示TXT文件无法读取怎么办?
把文件另存为uf-8格式就行了

一行代码太长怎么办?
用“\”符号就行了!

第七周

  1. 文件操作
    <变量名> = open(<文件名>,<打开模式>)
    文件最好跟程序在同一个目录下,这样就不用再指定文件地址
    文件打开模式主要有以下几种:
    在这里插入图片描述
    使用具体方法
    在这里插入图片描述

文件关闭:<变量名>.close()
文件一旦被打开,如果没有对应的关闭语句就是在程序中一直被打开,只有在程序退出时才会被自动关闭
2. 文件内容读取

操作方法 描述
<文件名>.read(size=-1) 读入全部内容,如果给出参数,读入前size长度,size为2,就是读前两个字符
<文件名>.readline(size=-1) 读入一行内容,如果给出参数,读入改行前size长度,size为2,就是读改行前两个字符
<文件名>.readlines(hint=-1) 读入文件所有行,以每行行为元素形成列表,如果给出参数,读入前hint行
  1. seek()内建函数
    参数为0:指针回到文件开头
    参数为1:指针回到当前位置
    参数为2:指针回到文件结尾
  2. 文件写的时候注意事项:

fo = open(“ls.txt”,"w+)# 打开文件,文本形式,覆盖写模式+读文件
fo.writelines(ls)# 读入文件所有行
fo.seek(0)# 将指针退回到文件开头
for line on fo:# 逐行打印
print(line)
fo.close#文件关闭

fo.seek(0)# 将指针退回到文件开头这一步非常重要,如果没有退回指针,那么打印出来的就没有结果。
上面这个程序也给出了遍历全文的一种常用的代码模板,要牢记。

文件驱动绘图程序

import turtle
turtle.title("数据驱动绘图")
turtle.color("red")
turtle.setup(800,800)
turtle.pensize(5)

# 数据获取,一组五个参数
# 300,0,144,1,0,0
# 前进距离,(0:左转,1:右转),转向的绝对角度,rgb对应的三个参数(0-1之间的小数)
data = []
f = open("datals.txt")
for line in f:
    line = line.replace("\n", " ")
    data.append(list(map(eval,line.split(","))))
f.close()
# 绘图
for i in range(len(data)):
    turtle.fd(data[i][0])
    turtle.color(data[i][3], data[i][4], data[i][5])
    if data[i][1]:
        turtle.right(data[i][2])
    else:
        turtle.left(data[i][2])
        

首次使用文件驱动程序,将数据与程序分离,创建接口大大提高了代码的适应性。麻烦的是需要将输入的数据进行处理。该程序中数据处理关键语句:

for line in f:
    line = line.replace("\n", " ")
    data.append(list(map(eval,line.split(","))))

数据传输进来,首先就将该行的换行符换为空格。然后数据是以字符串的形式传进来,使用spilt()函数将整个大的字符串数据,使用逗号“,”进行分隔成小的字符串。然后为了程序处理的数据均为数字,再使用eval函数将每个小的字符串去掉引号变成数字。(map(a,b)函数就是使用a函数对b中的每个元素进行函数操作。)再使用list将转化为数字的数据变成一个列表。最后使用append函数将输入文件的每一行进行拼接。最后形成的就是类似这种结构[[],[],[],[],[]]的一个列表。

  1. str.join(元组、列表、字典、字符串)
    用想要的符号进行分隔

list=[‘1’,‘2’,‘3’,‘4’,‘5’]
print(’’.join(list))
12345

  1. wordcloud
    安装词云 :pip install wordcloud
    构建词云对象

class wordcloud.WordCloud(font_path=None, width=400, height=200, margin=2, ranks_only=None, prefer_horizontal=0.9, mask=None, scale=1, color_func=None, max_words=200, min_font_size=4, stopwords=None, random_state=None, background_color=‘black’, max_font_size=None, font_step=1, mode=‘RGB’, relative_scaling=0.5, regexp=None, collocations=True, colormap=None, normalize_plurals=True)

参数 类型 描述
font_path string 指定字体的位置(可以在网上下载OTF或者TTF格式),默认使用DroidSansMono path
width int(default=400) 图片宽度,越大越精细
height int (default=200) 图片高度,越大越精细
prefer_horizontal float (default=0.90) 越接近1说明越喜欢水平的字,则字就不会为了适合展示而翻转成水平的
mask : nd-array or None (default=None) 将词云画在遮罩上
scale : float (default=1) 计算和画图的比例,当做大图的时候使用scale代替height和width速度会快,但会影响词之间的拟合度
min_font_size : int (default=4) 最小频率词的大小
font_step : int (default=1) 字体步长,如果大于1,可以增快计算速度,但是拟合度会下降
max_words : number (default=200) 图片容纳词语的上限
stopwords : set of strings or None 设置停用词,如果不设置则使用默认的停用词
background_color : color value (default=”black”) 背景颜色设置
max_font_size : int or None (default=None) 最大的词语的大小
mode : string (default=”RGB”) 当使用”RGBA”时,背景将变成透明的
relative_scaling : float (default=.5) 当relative_scaling=0时,词的大小是按照排名计算的,当relative_scaling=1时候则会按词频的倍数计算大小。
color_func : callable, default=None 根据每个词的font_size, position, orientation, font_path, random_state等属性为词语生成特定的颜色,具体参考matplotlib colormap
regexp : string or None (optional)
collocations : bool, default=True 是否考虑词语的搭配
colormap : string or matplotlib colormap, default=”viridis” Matplotlib colormap,如果color_func参数被指定,则此参数无效
normalize_plurals : bool, default=True 是否忽略复数
words_ (dict of string to float) 返回词频
layout_ (list of tuples (string, int, (int, int), int, color))) 词云词的属性信息

词云源程序

import jieba
import wordcloud
from scipy.misc import imread
mask = imread("china.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")# 输出生成的词云图片

只实现了最最基本的内容,而且scrip这个库需要导入,且遇到了版本太低的问题,而且图片的导入方式也不好,使用image库可能处理更加规范方便。
于是自行编写了以下程序:

import jieba
import wordcloud
from matplotlib import pyplot as plt
from  PIL import Image
import numpy as np


# 文本输入格式化
def word_txt(txt):
    f = open(txt, "r" ,encoding="utf-8")# 打开文件
    t = f.read()
    f.close()
    ls = jieba.lcut(t)# 将输入的词用空格分隔,才能被识别
    txt = " ".join(ls)
    return txt


# 读入背景图片
def image_deal(img):
    img = Image.open(img)
    img_array = np.array(img)# 将图片转化成数组
    return img_array

# 设置词云的参数
def wordcloud_set():
    word = wordcloud.WordCloud( font_path="simsun.ttc",\
                        mask = image_deal('wade6.jpg'),\
                        width=800, height=800,\
                        background_color = "black",\
                        stopwords=[],\
                        max_words=1000, \
                        min_font_size=5,\
                        max_font_size=200,\
                        scale=10,\
                        random_state=50)
    return word

word = wordcloud_set()
word.generate(word_txt('新时代中国特色社会主义.txt')) # 生成词云
word.to_file("grwordcloud.png")# 输出生成的词云图片
plt.imshow(word)
plt.axis('off')
plt.show()

第八周

1 Python库安装
第三方安装库网站:http://pypi.org/
三种方法:
方法一(主要方法,需要联网):使用pip命令
电脑自带cmd命令下进行操作:

作用 操作方法
安装库 pip install <第三方库名>
更新库 pip install -U<第三方库名>
卸载库 pip uninstall <第三方库名>
查看库的详细信息 pip show <第三方库名>
根据关键词在名称和介绍中搜索第三方库 pip search <关键词>

方法二:集成安装方法
*Anaconda :https//www.continuum.io
*支持800个第三方库
*包含多个主流工具
*适合数据计算领域开发
方法三:文件安装方法
对于有些库可以用pip下载,但是不能安装,为什么?
由于某些第三方库下载后,需要编译再安装,如果操作系统没有编译环境,则能下载但不能安装。
解决办法:
在这里插入图片描述

模拟比赛源程序

import random
import time
def printInformation():
    print("程序模拟A和B两个运动员之间的竞技比赛")
    print("程序输入为A、B选手的能力值(0至1之间的小数)及模拟场数N")


def getvalue():
    player_a = eval(input("请输入A选手能力值:"))
    player_b = eval(input("请输入B选手能力值:"))
    N = eval(input("请输入模拟场数:"))
    return player_a, player_b, N


def play_one_game(ability_a, ability_b, star_game):
    time.sleep(0.0001)
    a_win, b_win = 0, 0
    random_num = random.random()
    if star_game == "a" and (random_num < ability_a):
        a_win = 10.
        nx_star_game = "a"
    elif star_game == "a" and (random_num > ability_a):
        a_win = 0
        nx_star_game = "b"
    elif star_game == "b" and (random_num < ability_b):
        b_win = 1
        nx_star_game = "b"
    elif star_game == "b" and (random_num > ability_b):
        b_win = 0
        nx_star_game = "a"
    return a_win, b_win, nx_star_game


def play_n_game(ability_a, ability_b, n):
    num_a, num_b = 0, 0
    star_game = "a"
    while num_a + num_b != n :
        a_win, b_win, nx_star_game = play_one_game(ability_a, ability_b, star_game)
        num_a += a_win
        num_b += b_win
        star_game = nx_star_game
    return num_a, num_b


def result(num_a, num_b):
    n = num_a + num_b
    print("共模拟{}场比赛".format(n))
    print("选手A赢得{}场,胜率为:{:.1f}%".format(num_a, num_a*100/n))
    print("选手B赢得{}场,胜率为:{:.1f}%".format(num_b, num_b*100/n))


def main():
    printInformation()
    ability_a, ability_b, n = getvalue()
    num_a, num_b = play_n_game(ability_a, ability_b, n)
    result(num_a, num_b)


main()

代码与视频中的代码存在不同,是我自己看完写的,没有用视频的。
值得注意的是random()函数在最开始使用的for循环中出现了产生相同随机数的情况。也就是第四周中提到的伪随机数,我的解决办法是在函数中插入time.sleep(time),由于在不指定随机数种子的情况下,random()使用的是系统时间作为种子,时间精度为微秒。因此我进行sleep一定时间后再取随机数即可。看网上大神有更专业的处理方式或者不将其放到for循环之中,但是由于程序比较简单那就用简单一些的方式处理吧。

猜你喜欢

转载自blog.csdn.net/weixin_43125502/article/details/83023061