python_day3(2019-05-11)

函数

定义

python中定义函数要使用关键字def,语法格式如下。

# def 函数名(num):
#    pass
# return res
def caclulate(num):
    """
    计算1~num 的累加和
    :param num: 累加和的末尾
    :return: 求和结果
    """
# 列表推导式
    return sum([i for i in range(1, num+1)])

此时,我们便可以在另一个脚本中调用该函数

# 这是一个脚本测试文件
import caculate
print(caculate.caclulate(100))

# 运行结果
5050
参数
  • 必需参数
    这种参数必须以正确的数量和顺序传入,调用时应与声明的时候保持一致
# 函数声明
def f1(name,age):
    print("I am %s ,and I am %d years old"%(name,age)) 
# 函数调用
f1('eric',18) # 两个参数不能缺少,也不能调换位置

# 运行结果
I am eric ,and I am 18 years old

上例中name 和 age 为即为必需参数,在调用函数f1时,两个参数不可缺少,也不可调换位置。

  • 关键字参数
    即通过显式指定,使得可以允许我们自由调整参数的传入顺序, 这得益于 python解释器能够使用参数名字匹配参数值。
# 函数调用
f1(age = 18,name ="eric") #可以看到参数传入顺序发生了改变

# 运行结果
I am eric ,and I am 18 years old

在上例中,我们先传入age,再传入name,但由于是显式指定,因此成功运行。

  • 默认参数
    默认参数的使用:只需要在函数声明时,在形参后面直接赋上默认值即可。它的作用是当缺省参数没有传入时,默认值会生效。具体解释见程序注释。
# 函数声明
def f2(name,age,sex ="male"): # 给sex字段指定默认值
    print("I am %s ,and I am %d years old"%(name,age))
    print("sex: %s"%sex)
# 函数调用
f2('张三',88,sex = 'female') # 正常调用
f2(name= "李四",age =19) # 启用默认参数,默认sex字段为male

 # 运行结果
I am 张三 ,and I am 88 years old
sex: female # 参数值即我们传入的实参值
I am 李四 ,and I am 19 years old
sex: male # 调用时没有传入sex字段,此时启动默认参数。
匿名函数
  • 匿名函数即不需要显式指定函数名
  • 优点是减少代码量,看起来“优雅”(尤其对于那些只使用一次且函数体较简单的函数)
  • 匿名函数声明需要使用关键字 lambda,语法为lambda 参数: 表达式。其中冒号前是参数,可以有多个;冒号后是表达式,只能有一个,不写return,返回值即为表达式结果。
    下面我们来将普通函数和匿名函数来做个对比,其优雅简洁的特点显而易见。
# 使用一般函数
def cal(x, y):
    if x > y:
        return x * y
    else:
        return x / y
# 使用匿名函数
calc = lambda x, y:x * y if x > y else x / y

print("使用函数cal:",cal(6,5))
print("使用lambda表达式:",calc(6,5))
# 运行结果
使用函数cal: 30
使用lambda表达式: 30

lambda表达式常用于列表排序,在以下案例中可以体现

三国人物出场频率统计 —— jieba分词库

我们的目标是粗略的对小说中人物出场频率进行统计,并取出排名前十的人物。大体需要以下几步

  • 分词步骤 使用jieba.lucut()函数将文章分成一个个小词组,并把分词结果一股脑的存入words列表中。
  • 统计词频 通过遍历上述words序列,构造一个字典结构counts,其中key为词组,value为相应的词频数,如{曹操:999}。
  • 去除干扰 因为人名大多为两个字以上的,因此把分词结果中诸如“之,乎,者,也”等词长为1的给去除掉。除此之外,把与人名无关的词也去掉,如“将军”,“荆州”等
  • 合并同类 比如”玄德“与”刘备“的词频数就应该合并为同一类。
  • 人物排序 经过以上几步,我们已经得到了一个字典,接下来,我们要做的就是把这个字典按照value值(即词频数)进行降序排序。第一,将字典转化为一个列表,列表的每个元素就是一个元组。第二,利用列表的sort()函数以value为排序依据完成排序。
  • 生成词云 把排在前十的十个词组利用join()函数构造成一个字符串,并作为WordCloud.generate()函数的参数传入,即可
import jieba
from wordcloud import WordCloud

# 案例: 三国小说人物出场词频统计
def parse():
    """
    三国小说人物出场词频统计
    :return:
    """
# 1. excluds 即为无关词序列,用于从统计结果中除去这些词。
    excludes = {"将军", "却说", "丞相", "二人", "不可", "荆州", "不能", "如此", "商议",
                "如何", "主公", "军士", "军马", "左右", "次日", "引兵", "大喜", "天下",
                "东吴", "于是", "今日", "不敢", "魏兵", "陛下", "都督", "人马", "不知",
                '玄德曰', '孔明曰', '刘备', '关公' ,
                }
# 2. 读入文本,并完成分词步骤
    with open('threekingdom.txt','r',encoding='utf-8') as f:
        txt = f.read()
    words = jieba.lcut(txt)

    #print(words)
# 3. 构建字典结构来存储统计结果 如 “曹操”: 555
    counts = {}
    for word in words:
        if len(word) < 2:
            continue
        else:
            # 往字典里增加元素
            # counts[‘key’] = 888
            counts[word] = counts.get(word,0) + 1
   # print(counts)
# 4. 合并同类
    counts['孔明'] = counts.get('孔明') + counts.get("孔明曰")
    counts['玄德'] = counts.get('玄德') + counts.get("玄德曰") + counts.get("刘备")
    counts['关公'] = counts.get('关公') + counts.get("云长")
# 5. 删除无关词
    for word in excludes:
        del counts[word]

# 6. 统计出现频次最高的前20个词 方法1
    items = list(counts.items())   # 每个元素是一个元组
    #print(items)
    items.sort(key = lambda x:x[1],reverse = True)
    #print("排序后:",items)

    for i in range(10):
        character, count = items[i]
        print(character,count)
 # 7. 构造词云字符串
    li = []
    for i in range(10):
        character, count = items[i]
        for _ in range(count):
            li.append(character)
    cloud_txt = ",".join(li)
    wc = WordCloud(
        #background_color = "white",
        font_path = '/usr/share/fonts/opentype/noto/NotoSansCJK-Black.ttc',
        # 是否包含两个词的搭配,默认为True
        collocations = False
    ).generate(cloud_txt)
    wc.to_file('三国出场率前十人物.png')

parse()
# 运行结果
孔明 1204
玄德 1159
曹操 910
张飞 340
孙权 259
吕布 258
赵云 254
云长 241
司马懿 221
周瑜 216

词云生成图如下


三国出场率前十人物.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容