python学习(4-6)


前言

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

四、第四周课程学习

1、程序的分支结构

1.单分支结构

根据判断条件结果而选择不同向前路径的运行方式

if <条件><语句块>

2.二分支结构

根据判断条件结果而选择不同向前路径的运行方式

if <条件>:
  <语句块1>
else:
  <语句块2>

紧凑形式:适用于简单表达式的二分支结构

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

3.多分支结构

根据判断条件结果而选择不同向前路径的运行方式

if <条件>:
  <语句块>
elif:
  <语句块>
  ……
else:
  <语句块>

4.条件判断

操作符
在这里插入图片描述
在这里插入图片描述

5.异常处理

try<语句块1>
except<异常类型>):
  <语句块2>

如果出现了异常,则执行语句块2,没有出现则执行语句块1。
如果规定了异常类型,那么只有在出现该异常类型时,才会执行语句块2。

异常处理的高级使用

try :
  <语句块1>
except :
  <语句块2>
else :
  <语句块3>
finally<语句块4>
#  finally 对应的语句块4一定执行
#  else对应的语句块3在不发生异常时执行

2、实例:身体质量指数BMI

在这里插入图片描述

#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 bmi >= 18.5 and bmi < 24:
    who ,nat = "正常" , "正常"
elif bmi < 25 and bmi >=24:
    who ,nat = "正常" , "偏胖"
elif bmi < 28 and bmi >=25:
    who ,nat = "偏胖" , "偏胖"
elif bmi >= 18.5:
    who ,nat = "肥胖" , "肥胖"
print("BMI指标为:国际'{0}',国内'{1}'".format(who,nat))

3、程序的循环结构

1.遍历循环

遍历某个结构形成的循环运行方式

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

2.无限循环

由条件控制的循环运行方式

while <条件>:
  <语句块>
#反复执行语句块,直到条件不满足时结束

3.循环控制保留字

break和continue
-break跳出并结束当前整个循环,执行循环后的语句(一个break跳出一个循环)
-continue结束当前循环,继续执行后续次数循环

4.循环的高级用法

for <循环变量> in <遍历结构>:
  <语句块>
else :
  <语句块2>

-当循环没有被break语句退出时,执行else语句块
-else语句块作为 正常 完成循环的奖励
-这里else的用法与异常处理中else用法相似

4、random库

random库是使用随机数的python标准库
-伪随机数:采用梅森旋转算法生成的(伪)随机序列中元素
-random库主要用于生成随机数
-使用random库: import random

-基本随机数函数:seed() ,random()
-扩展随机数函数:randint(),getrandbits(),uniform()
               randrange(),choice(),shuffle()

1.基本随机数函数

随机数种子—》梅森旋转算法—》随机序列
给定种子seed,则后续随机数可以复现
不给定,则默认使用当前系统时间,很难复现
在这里插入图片描述

2.扩展随机数函数

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

5、圆周率的计算

公式法

#CalPiV1.py
pi = 0
N = 100
for k in range(N):
  pi = pi + 1/pow(16,k)*(4/(8*k+1)-2/(8*k+4)-1/(8*k+5)-1/(8*k+6))
print("圆周率的值为:{:.7f}".format(pi))

蒙特卡洛方法
随机撒点

#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 += 1
pi = 4 * (hits/DARTS)
print("圆周率的值是:{}".format(pi))
print("运行时间是:{:.5f}S".format(perf_counter()-start))

第九行中的 **表示指数运算,也可以用pow来算,但是不能用^来算,在python中是别的含义

五、第五周课程学习

1.函数的定义与使用

1)函数的理解和定义

函数是一段代码的表示
-函数是一段具有特定功能的、可以重复使用的语句组
-函数是一种功能的抽象,一般函数表达特定功能
-两个作用:降低编程难度代码复用

def <函数名>(<参数(0个或者多个)>):
    <函数体>
    return <返回值>

函数是IPO的实现,也是完整代码的封装

2)函数的调用

调用时要给出实际参数,替换占位符,运算后给出结果

3)参数个数

函数可以有参数,也可以没有,但必须要有括号

def <函数名>(<非可选参数><可选参数>)<函数体>
  return <返回值>

可选参数必须放在非可选参数后面。
函数调用时,参数可以按照位置或者名称方式传递

4)函数的返回值

函数可以返回0个或者多个结果
-return保留字用来传递返回值
-函数可以有返回值,也可以没有,可以有return,也可以没有。

def fact(n,m=1):
  s= 1
  for i in range(1,n+1):
  s *=i
  return s//m , n, m 

或者用

a,b,c = fact(10,5)

也是用元祖方式返回的

5)局部变量和全局变量

在函数体内部使用的变量叫局部变量,而在函数外使用的叫做全局变量。
规则1:局部变量和全局变量是不同变量
-局部变量是函数内部的占位符,与全局变量可能重名但不同
-函数运算结束后,局部变量将被释放
-可以用global保留字在函数内部使用全局变量

规则2:局部变量为组合数据类型,并且未创建,等同于全局变量

使用规则:
-基本数据类型,无论是否重名,局部变量和全局变量不同
-可以通过global保留字在函数内部生命全局变量
-组合数据类型,如果局部变量未真实创建,则是全局变量

6)lambda函数

lambda函数返回函数名作为结果
-lambda函数是一种匿名函数,即没有名字的函数
-使用lambda保留字定义,函数名是返回结果
-lambda函数用于定义简单的、能够在一行内表示的函数

<函数名> = lambda<参数>:<表达式>
#等价于
def <函数名>(<参数>):
    <函数体>
    return <返回值>

2.实例:七段数码管

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 [2,3,0,5,6,8,9] else drawLine(False)
    drawLine(True) if digit in [2,6,8,0] 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):
    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()

3.代码复用和函数递归

函数和对象是代码复用的两种主要形式
函数:将代码命名在代码层面建立了初步抽象
对象:属性和方法< a>.< b>和< a>.< b>()在函数纸上再次组织进行抽象

1)模块化设计

分而治之
-通过函数或者对象封装将程序划分为模块及模块间的表达
-具体包括:主程序、子程序和子程序间关系
-分而治之:一种分而治之,分层抽象,体系化的设计思想

2)紧耦合&松耦合

紧耦合:两个部分之间交流很多,无法独立存在
松耦合:两个部分之间交流很少,可以独立存在
-模块内部紧耦合,模块之间松耦合

3)函数递归的理解

函数定义中调用函数自身的方式
两个关键特征
n ! = {   1 , n = 0 n ( n − 1 ) ! o t h e r w i s e n!= \begin{cases} \ 1, & n=0\\ n(n - 1)! &otherwise \end{cases} n!={ 1,n(n1)!n=0otherwise
-链条:计算过程存在递归链条
-基例:存在一个或多个不需要再次递归的基例
只关心链条,而不是关注问题具体操作,即关心n和n-1之间的关系

4)函数递归实例

将字符串s反转后输出

def rvs(s):
  if s== ""
    return s 
  else :
    return rvs(s[1:])+s[0]

汉诺塔问题

#HanNuoTa.py
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)

3.PyInstaller库的使用

PyInstaller库是第三方库
-官方网站:http://www.puinstaller.org
-第三方库
-可以使用PIP
打包源代码,要在CMD里面执行,有点意思

4.科赫雪花小包裹

高大上的分形几何(什么鬼)
-分形几何是一种迭代的几何图形,广泛存在自然界中
科赫曲线也叫雪花曲线

#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,800)
    turtle.delay(0)
    #turtle.speed(1)
    turtle.penup()
    turtle.goto(-200,100)
    turtle.pendown()
    turtle.pensize(2)
    level = 3
    koch(400,level)
    turtle.right(120)
    koch(400,level)
    turtle.right(120)
    koch(400,level)
    turtle.right(120)
    turtle.hideturtle()
main()

六、第六周课程学习

1、集合类型及操作

1.集合类型定义

集合是多个元素的无序组合
-集合类型与数学的概念一致
-集合元素之间无需,每个元素唯一,不存在相同元素
-集合元素不可更改,不能是可变数据类型
-用大括号{}表示,元素间用逗号分开
-建立集合用{}或者set函数
-建立空集合类型,必须使用set()

2.集合操作符

在这里插入图片描述
此外还有= ,>=等

在这里插入图片描述

3.集合处理方法

在这里插入图片描述
在这里插入图片描述
可以利用集合无重复的特点,数据去重

2、序列类型及操作

1.序列类型定义

序列是具有先后关系的一组元素
-序列是一维元素向量,元素类型可以不同
-类似数学元素序列: s 0 , s 1 , . . . , s n − 1 s0,s1,...,sn-1 s0,s1,...,sn1
-元素箭由序号引导,通过标访问序列的特定元素

序列是一个基类类型
演化成字符串类型,元组类型,列表类型,其基本特征在这三种类型中都成立

2.序列类型及其操作

在这里插入图片描述

ls = ["Python",123,".io"]
ls[::-1]
可得到
[".io",123,"Python"]

s="python123.io"
s[::-1]
'oi.321nohtyp'

在这里插入图片描述

3.元组类型及操作

元组是序列类型的一种扩展
-元组是一种序列类型,一旦创建就不能被修改
-使用小括号()或者tuple()创建,元素间用逗号,分隔
-可以使用或不适用小括号
就是将元素进行有序排列
-继承了序列类型的全部通用操作
-创建后不能修改,所以没有特别的操作
-可以不适用小括号

4.列表类型及其操作

列表是序列类型的一种拓展,十分常用
-列表是一种列表类型,创建后可以随意被修改
-使用方括号[]或者list()创建,元素间用逗号,分隔
-列表中各元素类型可以不同,无长度限制

只有使用了[]或者list()才是真正的创建了一个列表,如果只是用=进行赋值,那么仅仅创建了一个新的名字。
在这里插入图片描述
在这里插入图片描述

5.序列类型应用场景

-元组用于元素不改变的应用场景,更多用于固定搭配场景
-列表更加灵活,他是最常用的序列类型
-最主要作用:表示一组有序数据,进而操作它们
如果不希望数据被改变,可以变成元组类型

3、基本统计值

-总个数:len()
-求和:for … in
-平均值:求和/总个数
-方差:各个数据与平均数差的平方的和的平均数
-中位数:排序,奇数取中间,偶数…

sorted()函数可以对列表排序(可以用于求中位数)

#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("平均值:{},方差:{},中位数:{}".format(m,dev(n,m),median(n)))

4、字典类型及其操作

理解“映射”
-映射是一种键(索引)和值(数据)的对应
序列类型由0……N整数作为数据的默认索引

字典类型是映射的体现
-键值对:键是数据索引的扩展
-字典是键值对的集合,键值对之间无序
-采用大括号{}和dict()创建,键值对用:表示

操作函数

在这里插入图片描述
在这里插入图片描述

5、jieba库概述

是优秀的中文分词第三方库
-中文文本需要通过分词获得单个的词语
-jieba是优秀的中文分词第三方库,需要额外安装
-jieba库提供三种分词模式,最简单只需要掌握一个函数

-利用一个中文词库,确定汉子之间的关联概率
-汉字间概率大的组成词组,形成分词结果
-除了分词,用户还可以添加自定义的词组

-精确模式:吧文本精确的切开,不存在冗余单词
-全模式:吧文本中所有可能的次于都扫描出来,有冗余
-搜索引擎模式:在精确模式基础上,对长词再次切分
在这里插入图片描述
在这里插入图片描述

6、文本词频统计

英文hamlet词频统计:

#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))


三国演义人物出场统计(初步):

#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))


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值