Python基础

1.Python概述

1.1.概述

  • 起源于1989年,发行于1991年,是一个免费、开源、跨平台、动态、面型对象的编程语言。
    在这里插入图片描述

1.2.语言优势

  • 简单高效:容易上手,开发效率比其它主流语言高1/3~1/5;
  • 适应性广:Python语言不仅适合专业人员,也适合非专业人员学习、使用;
  • 应用广泛:软件开发的各种领域都可以使用;
  • 资源丰富:Django/Requests/Numpy/Pandas/Matpotlib/TensorFlow/PyTorch/Scikit-learn…
    在这里插入图片描述

1.3.适用岗位

  • Web服务端开发
  • 爬虫
  • 数据分析
  • 机器学习
  • 自动化测试
  • 自动化运维

在这里插入图片描述

2.Python基础体系

  • Python核心:Python介绍、数据基本运算、语句、容器、函数;

3.Python核心

3.1.基础介绍

在这里插入图片描述

硬件:

1944年,美籍匈牙利数学家冯·诺依曼提出计算机基本机构。包含五大组成部分:运算器、控制器、存储器、输入设备、输出设备,即冯·诺依曼架构。

  • 运算器:按照程序中的指令,对数据进行加工处理。
  • 控制器:根据程序需求,指挥计算机的各个部件协调工作。
  • 通常将运算器和控制器集成在中央处理器(CPU)中。
  • 存储器:保存各类程序的数据信息。
  • 内存RAM:容量小,速度快,临时存储数据
  • 硬盘HDD:容量大,速度慢,永久存储数据
  • 输入设备:外界向计算机传送信息的装置
  • 例如:鼠标、键盘、扫描仪…
  • 输出设备:计算机向外界传送信息的装置
  • 例如:显示器、音响、打印机…

在这里插入图片描述

软件:

没有软件的计算机称之为裸机,无法完成任何工作

  • 操作系统:管理和控制计算机软件与硬件资源的程序
  • 隔离不同硬件差异,使软件开发简单化
  • Windows、Linux、Unix
  • 应用软件:为了某种特定的用途而被开发的软件
  • 软件:软件=程序+文档
  • 程序是一组计算机能识别和执行的指令集合
  • 文档是为了便于了解程序所需的说明性材料

在这里插入图片描述

3.2.基础知识

3.2.1.Python环境安装与配置

3.2.1.1.Python安装

下载地址:https://www.python.org/ftp/python/
选用版本:python-3.8.9-amd64.exe
在这里插入图片描述

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

检查python是否安装成功:
①win+r,输入cmd,进入命令行窗口

在这里插入图片描述

②在命令行窗口中输入python,出现如下信息,python安装成功

在这里插入图片描述

3.2.1.2.Pycharm安装

下载:https://www.jetbrains.com/pycharm/download/
1.找到你下载PyCharm的路径,双击.exe文件进行安装。

在这里插入图片描述

2.点击 Next 后,我们进行选择安装路径页面(尽量不要选择带中文和空格的目录)选择好路径后,点击 Next 进行下一步

在这里插入图片描述

3.进入 Installation Options(安装选项)页面,全部勾选上。点击 Next

在这里插入图片描述

4.进入 Choose Start Menu Folder 页面,直接点击 Install 进行安装
在这里插入图片描述

5.等待安装完成后出现下图界面,我们点击 Finish 完成。

在这里插入图片描述

3.2.2.Python程序的执行方式

3.2.2.1.交互式

在命令行输入指令,回车即可得到结果。
(1) 打开终端
(2) 进入交互式:python3
(3) 编写代码:print(“hello world”)
(4) 离开交互式:exit()

3.2.2.2.文件式

将指令编写到.py文件,可以重复运行程序。
(1) 编写文件
(2) 打开终端
(3) 进入程序所在目录:cd目录
(4) 执行程序: python3 文件名

在这里插入图片描述

3.2.2.3.Linux常用命令

(1) pwd:查看当前工作目录的路径
(2) cd:改变工作目录(进入到某个目录)

练习:

(1) 在指定目录创建python文件.
–目录:/home/tarena/month01
–文件名:exercise01.py
(2) 在文件中写入:print(“你好,世界!”)
(3) 运行python程序
3.2.2.4.执行过程
计算机只能识别机器码(1010),不能识别源代码(python)。
(1)由源代码转变成机器码的过程分成两类:编译和解释。
(2)编译:在程序运行之前,通过编译器将源代码变成机器码,例如:C语言。
– 优点:运行速度快
– 缺点:开发效率低,不能跨平台。
(3)解释:在程序运行之时,通过解释器对程序逐行翻译,然后执行,例如Javascript。
– 优点:开发效率高,可以跨平台;
– 缺点:运行速度慢。
(4)python是解释型语言,但为了提高运行速度,使用了一种编译的方法。编译之后得到pyc文件,存储了字节码(特定于Python的表现形式,不是机器码)
源代码 – 编译 --> 字节码 – 解释 --> 机器码
|————1次———|

3.2.2.5.解释器类型

(1) CPython(C语言开发)
(2) Jython (java开发)
(3) IronPython (.net开发)

3.3.数据基本运算

"""
汇率转换器
"""
# 1. 获取数据 - 美元
usd = input("请输入美元:")
# 2. 逻辑处理 - 美元 * 6.99
cny = int(usd) * 6.99
# 3. 显示结果 - xx美元是xx人民币
print(usd + "美元是" + str(cny) + "人民币")

3.3.1.基础知识

3.3.1.1.Pycharm常用快捷键

(1) 移动到本行开头:home键
(2) 移动到本行末尾:end键盘
(3) 注释代码:ctrl + /
(4) 复制行:ctrl +d
(5) 删除行:shift + delete
(6) 选择列:shift + alt +鼠标左键
(7) 移动行:ctrl + shift + 上下箭头
(8) 代码格式化:ctrl+alt+l
(9) project窗口开启/关闭 ALT+1

3.3.1.2.注释

通常是对代码的描述信息。
(1) 单行注释:以#号开头。
(2) 多行注释:三引号开头,三引号结尾。

3.3.2.数据

3.3.2.1.变量

定义:在内存中操作数据的空间。
语法:变量名 赋值号 数据,如:num = 88。
复用性:一个变量可以被多次使用,重复操作一个数据,以提高代码的可读性。
可变性:一个变量可以被重复赋值,实现对程序状态的调节以适应现实环境的变化。
命名:由字母、数字、下划线组成,且不能以数字开头。不能使用关键字(蓝色),否则发生语法错误SyntaxError。
建议命名:字母小写,多个单词以下划线隔开。Class_name = “xxx”

3.3.2.2.函数

封装了一个特定功能的代码块,可以重复调用
比如:终端中输入用input函数,输出用print函数
(1) input函数
作用:将终端中用户输入的数据存储在程序中
语法:变量 = input(提示信息)
应用:输入数据

name = input("请输入姓名:")
age = input("请输入年龄:")
print(name + "的年龄是:" + age + ".")

(2) print函数
作用:将括号中的数据显示在终端中
语法:print(数据)
应用:呈现结果

usd = input("请输入美元:")
cny = input("请输入人民币:")
print(usd + "美元=" + cny + "人民币")

表示一个功能,函数定义者是提供功能的人,函数调用者是使用功能的人。

(1)print(数据) 作用:将括号中的内容显示在控制台中

print("你好")
print("世界")

(2)变量 = input(“需要显示的内容”) 作用:将用户输入的内容赋值给变量

name = input("请输入姓名:")
age = input("请输入年龄:")
print(name + "的年龄是:" + age + ".")
3.3.2.3.字符串 str

(1) 用来记录文本信息(文字信息)。
(2) 字面值:双引号

3.3.2.4.整形int

表示整数,包含正数、负数、0。
如: -5, 100, 0

3.3.2.5.浮点型float

(1) 表示小数,包含正数、负数,0.0。
(2) 字面值:小数:1.0 2.5

3.3.3.运算

3.3.3.1.类型转换

(1) 语法:
变量名 = 目标类型(待转数据)
(2) 例如:
usd = input(“请输入美元:”)
cny = input(“请输入人民币:”)
print(usd + “美元=” + cny + “人民币”)
name = “大圣”
print(“您好:” + name) # 文本拼接
变量名 = int(数据)
变量名 = float(数据)
变量名 = str(数据)
(3) 适用性:
输入数据、输出结果
(4) 转换为布尔:bool(数据)
结果为False:bool(0) bool(0.0) bool(None)
(5) 混合类型自动升级:
1 + 2.14 返回的结果是 3.14
1 + 3.0 返回结果是: 4.0

# str -> int
data01 = int("3")
# int -> str
data02 = str(5)
# str -> float
data03 = float("1.2")
# float -> str
data04 = str(1.2)
# int -> float
data05 = float(250)
# float -> int
data06 = int(1.9)
print(data06) # 1 向下取整(截断删除)
# 注意:字符串转换为其他类型时,
# 必须是目标类型的字符串表达形式
# print(int("10.5")) # 报错
# print(float("abc"))# 报错

练习:在终端中输入商品单价、购买的数量和支付金额。计算应该找回多少钱。
效果:
请输入商品单价:5
请输入购买数量:3
请输入支付金额:20
应找回:5.0

price = float(input("请输入商品单价:"))
num = int(input("请输入购买数量:"))
amount = float(input("请输入支付金额:"))
res = (amount-price*num)
print("应找回:" + str(res))
3.3.3.2.算数运算
3.3.3.2.1.算术运算符

在这里插入图片描述

练习1:在终端中输入一个疫情确诊人数再录入一个治愈人数,打印治愈比例
格式:治愈比例为xx%
效果:
请输入确诊人数:500
请输入治愈人数:495
治愈比例为99.0%

num1 = int(input("请输入确诊人数:"))
num2 = int(input("请输入治愈人数:"))
percent = num2 / num1 * 100
print("治愈比例为" + str(percent) + "%")

练习2:古代的秤,一斤十六两。在终端中获取两,计算几斤零几两。
效果:
请输入总两数:100
结果为:6斤4两

nums = int(input("请输入总两数:"))
weight1 = nums//16
weight2 = nums%16
print("结果为:" + str(weight1) + "斤" + str(weight2) + "两")
3.3.3.2.2.增强运算符

在这里插入图片描述

data01 = 10
# data01 + 5
# print(data01) # 10
data01 += 5 # data01 = data01 + 5
print(data01) # 15

练习:在终端中输入一个四位整数,计算每位相加和。
例如:录入1234,打印1+2+3+4结果
效果:
请输入四位整数:1234
结果是:10

num = int(input("请输入四位整数:"))
num1 = num//1000
num2 = num%1000//100
num3 = num%100//10
num4 = num%10
res = num1 + num2 + num3 + num4
print("结果是:" + str(res))
3.3.3.3.布尔运算
3.3.3.3.1.布尔类型

表示条件是否成立,只有两个值:True和False
True 表示满足条件、False 表示不满足条件

3.3.3.3.2.比较运算符

在这里插入图片描述

返回布尔类型的值
比较运算的数学表示方式: 0 <= x <= 100

# 存款大于500000
print(int(input("说存款"))>=500000)
# 有房产
print(input("说房产")=="有")
# 黄金年龄
print(25 <= int(input("说年龄"))<= 35)

练习: 根据条件写出代码
输入的是正数:大于零
输入的是偶数:能被2整除
输入的是星期:1到7之间

print(int(input("输入的是正数"))>0)
print(int(input("输入的是偶数"))%2==0)
print(7>=int(input("输入的是星期"))>=1)
3.3.3.3.3.逻辑运算符

1)与and:表示并且的关系,类似串联
在这里插入图片描述

int(input(“请输存款:”)) >= 100000 and input(“请输房产:”) == “有”
2)或or:表示或者关系,类似并联
在这里插入图片描述

int(input(“请输存款:”)) > 100000 or input(“请输房产:”) == “有”
3)非not:表示取反
在这里插入图片描述

练习:根据命题写出代码
年龄大于25 并且 身高小于170
职位是高管 或者 年薪大于500000

print(int(input("请输入年龄:"))>25 and int(input("请输入身高:")) < 170 )
print(input("请输入职位:") == "高管" or int(input("请输入年薪:")) > 500000)
3.3.3.4.优先级

在这里插入图片描述

3.4.语句

3.4.1.行

(1) 物理行:程序员编写代码的行。
(2) 逻辑行:python解释器需要执行的指令。
(3) 建议:
一个逻辑行在一个物理行上。
如果一个物理行中使用多个逻辑行,需要使用分号;隔开。
(4) 换行:
如果逻辑行过长,可以使用隐式换行或显式换行。
隐式换行:所有括号的内容换行,称为隐式换行
括号包括: () [] {} 三种
显式换行:通过折行符 \ (反斜杠)换行,必须放在一行的末尾,目的是告诉解释器,下一行也是本行的语句。

# 4个物理行 4个逻辑行
a = 1
b = 2
c = a + b
print(c)
# 1个物理行 4个逻辑行(不建议)
a = 1;b = 2;c = a + b;print(c)
# 4个物理行 1个逻辑行
# -- 换行符
d = 1+\
2+\
3+4\
+5+6
# -- 括号
e = (1+2+
3+4
+5+
6)

3.4.2.选择语句

3.4.2.1.if else 语句

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

(1) 作用:
让程序根据条件有选择性的执行
(2) 语法:

if 条件:
	满足条件内容
else:
	不满足条件内容

练习:
在终端中输入体温,如果在36到37之间,输出正常,否则异常。

tem = float(input("输入体温:"))
if 37 > tem > 36 :
    print("体温正常")
else:
    print("体温异常")
3.4.2.2.省略else

在这里插入图片描述

if 条件:
	满足条件内容

练习:
在终端中输入课程阶段数,显示课程名称
效果:
输入: 输出:
1 Python语言核心编程
2 Python高级软件技术
3 Web全栈
4 人工智能

num = int(input("请输入课程阶段数:"))
if num == 1 :
    print("Python语言核心编程")
if num == 2 :
    print("Python高级软件技术")
if num == 3 :
    print("Web全栈")
if num == 4 :
    print("人工智能")
3.4.2.3.elif

在这里插入图片描述

if 条件1:
	满足条件1内容
elif 条件2:
	满足条件2内容
elif 条件3:
	满足条件3内容
else:
	均不满足

练习1:
在终端中输入一个数字,判断后输出正数或者负数或者零。

num = int(input("请输入一个数字:"))
if num > 0:
    print("正数")
elif num < 0:
    print("负数")
else:
    print("0")

练习2:
根据心理年龄与实际年龄,打印智商等级。
智商IQ = 心理年龄MA 除以 实际年龄CA 乘以 100
天才:140以上(包含)
超常:120-139之间(包含)
聪慧:110-119之间(包含)
正常:90-109之间(包含)
迟钝:80-89之间(包含)
低能:80以下

ma = int(input("请输入心理年龄:"))
ca = int(input("请输入实际年龄:"))
iq = int(ma / ca * 100)
if iq >= 140:
    print("天才")
elif 120 <= iq <= 139:
    print("超常")
elif 110 <= iq <= 119:
    print("聪慧")
elif 90 <= iq <= 109:
    print("正常")
elif 80 <= iq <= 89:
    print("迟钝")
else:
    print("低能")
3.4.2.4.if嵌套

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

if 条件:
	if 条件1:
		满足条件2内容
	elif 条件2:
		满足条件2内容
	elif 条件3:
		满足条件3内容
	else:
		均不满足

练习:
在终端中输入月份,打印相应的天数.
1 3 5 7 8 10 12 有 31天
2 有 29天
4 6 9 11 有 30天
超过月份提示月份有误
效果:
请输入月份:10
31天

mon = int(input("请输入月份:"))
if 1 <= mon <= 12:
    if mon == 2:
        print("29天")
    elif mon == 4 or mon == 4 or mon == 6 or mon == 9 or mon == 11:
        print("30天")
    else:
        print("31天")
else:
    print("月份有误")

3.4.3.循环语句

3.4.3.1.while语句
3.4.3.1.1.延长程序生命

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

练习:
让下列代码重复执行,输入y继续(不输入y则退出)

number = int(input("请输入数字:"))
if number > 0:
	print("正数")
elif number < 0:
	print("负数")
else:
	print("零")
while input("输入y继续:") == "y":
    number = int(input("请输入数字:"))
    if number > 0:
        print("正数")
    elif number < 0:
        print("负数")
    else:
        print("零")
3.4.3.1.2.循环计数

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

练习1:
在终端中显示0 1 2 3
在终端中显示2 3 4 5 6
在终端中显示1 3 5 7
在终端中显示8 7 6 5 4
在终端中显示-1 -2 -3 -4 -5

count = 0
while count < 4:
    print(count)
    count += 1

print("--------------------")

count = 2
while count < 7:
    print(count)
    count += 1

print("--------------------")

count = 1
while count < 8:
    if count % 2 != 0:
        print(count)
    count += 1

print("--------------------")

count = 8
while count > 3:
    print(count)
    count -= 1

print("--------------------")

count = -1
while count > -6:
    print(count)
    count -= 1

练习2:
一张纸的厚度是0.01毫米
请计算,对折多少次超过珠穆朗玛峰(8844.43米)
思路:
数据:厚度、高度、次数
算法:厚度*=2 次数+=1

num = 0
height = 0.01
while height / 1000 < 8844.43:
    height *= 2
    num += 1
print("对折" + str(num) + "次超过珠穆朗玛峰")

练习3:
程序产生1个,1到100之间的随机数。
让玩家重复猜测,直到猜对为止。
每次提示:大了、小了、恭喜猜对了,总共猜了多少次。
效果:
请输入要猜的数字:50
大了
请输入要猜的数字:25
小了
请输入要猜的数字:35
大了
请输入要猜的数字:30
小了
请输入要猜的数字:32
恭喜猜对啦,总共猜了5次

import random

num = random.randint(1, 100)

count = 0
while True:
    temp = int(input("请输入要猜的数字:"))
    count += 1
    if temp > num:
        print("大了")
    elif temp < num:
        print("小了")
    else:
        print("恭喜猜对了,总共猜了"+ str(count) +"次")
        break
3.4.3.2.for 语句

在这里插入图片描述

for 变量 in range(开始,结束,间隔):
	语句组
# 写法1:range(开始,结束,间隔)
# 注意:不包含结束值
for item in range(1, 3, 1):
	print(item)
# 写法2:range(开始,结束)
# 注意:间隔默认为1
for item in range(1, 3):
	print(item)
# 写法3:range(结束)
# 注意:开始默认为0
for item in range(3):
	print(item)

练习1:
在终端中累加 0 1 2 3
在终端中累加 2 3 4 5 6
在终端中累加 1 3 5 7
在终端中累加 8 7 6 5 4
在终端中累加 -1 -2 -3 -4 -5

sum1 = 0
for i in range(4):
    sum1 = sum1 + i
    print(i)
print("累加的和为:" + str(sum1))
print("----------------------")

sum2 = 0
for i in range(2, 7):
    sum2 = sum2 + i
    print(i)
print("累加的和为:" + str(sum2))
print("----------------------")

sum3 = 0
for i in range(1, 8, 2):
    sum3 = sum3 + i
    print(i)
print("累加的和为:" + str(sum3))
print("----------------------")

sum4 = 0
for i in range(8, 3, -1):
    sum4 = sum4 + i
    print(i)
print("累加的和为:" + str(sum4))
print("----------------------")

sum5 = 0
for i in range(-1, -6, -1):
    sum5 = sum5 + i
    print(i)
print("累加的和为:" + str(sum5))
print("----------------------")

练习2:一张纸的厚度是0.01毫米请计算,对折15次的厚度是多少毫米

weight = 0.01
for i in range(15):
    weight *= 2
    print("对折" + str(i+1) + "次")
print("对折15次后纸的厚度是:" + str(weight) + "毫米")

练习3:程序产生一个1到100之间的随机数,让玩家最多重复猜5次
每次提示:大了、小了、恭喜猜对了,总共猜了多少次。

import random

res = False
num = random.randint(1, 100)
print("===============猜猜看,最多猜5次===============")

for i in range(5):
    tem = int(input("请输入要猜的数字:"))
    if tem > num:
        print("大了")
    elif tem < num:
        print("小了")
    else:
        print("恭喜猜对了,总共猜了" + str(i + 1) + "次!")
        res = True
if not res:
    print("对不起,您的次数已用完,请重启程序再试!")
3.4.3.3.对比
  • while 循环
    擅长于根据条件重复
    例如:纸张对折到珠穆朗玛峰
  • for循环
    擅长于根据次数重复
    例如:纸张对折15次

3.4.4.跳转语句

在这里插入图片描述

3.4.4.1.break 语句

跳出循环体,后面的代码不再执行。

3.4.4.2.continue 语句

跳过当前循环体中剩余代码,继续执行下一次循环

# 需求:累加1-100之间能被3整除的数字
# 思想:不满足条件跳过,否则累加.
sum_value = 0
for item in range(1, 101):
if item % 3 != 0:
continue
sum_value += item
print(sum_value)

练习:累加10 – 60之间,个位不是3/5/8的整数和
思路1:个位不是3/5/8则累加
思路2:个位是3/5/8就跳过,否则累加

total = 0
for i in range(10, 61):
    if i % 10 == 3 or i % 10 == 5 or i % 10 == 8:
        continue
    total += i
print("累加10 -- 60之间,个位不是3/5/8的整数和为:" + str(total))

3.5.容器

3.5.1.列表list

在Python中可以使用列表,对日常生活中的大量数据进行管理,若没有列表类型,一个变量只能操作一个数据;手动为每个数据创建变量,无法动态添加数据。
定义:由一系列变量组成的可变序列容器。
语法:

列表名 = [元素1,元素2,元素3]

案例:list_mov = [“电影1”,“电影2”,“电影3”]
在这里插入图片描述

练习:
创建列表存储3个地区名称
创建列表存储3个新增人数
创建列表存储3个现有人数

list_area = ["台湾", "陕西", "浙江"]
list_add_person = [16, 182, 2]
list_cur_person = [2339, 859, 505]

3.5.1.1.序列
定义:有顺序且空间连续的容器类型。
基础操作:
+:用于连接两个容器
*:重复生成容器元素

list_movie01 = ["电影1"]
list_movie02 = ["电影2","电影3"]
list_movie03 = list_movie01 + list_movie02 # ["电影1","电影2","电影3"]
list_movie04 = list_movie01 * 2 # ["电影1","电影1"]

成员运算:
作用:判断容器中是否存在某一元素
语法:in not in

list_movie = ["电影1","电影2","电影3"]
print("电影1" in list_movie) # True
print("电影22" not in list_movie) # True
print("3" in list_movie) # False

常用函数:
len函数:计算容器中元素的数量
max函数:计算容器中最大的元素
min函数:计算容器中最小的元素
sum函数:对容器中元素求和计算

list_movie = [690761,532622,446700]
print(len(list_movie)) # 3
print(max(list_movie)) # 690761
print(min(list_movie)) # 446700
print(sum(list_movie)) # 1670083

练习:
计算新增列表最大值
计算现有列表最小值
对新增列表进行求和
判断现有列表是否存在859

list_area = ["台湾", "陕西", "浙江"]
list_add_person = [16, 182, 2]
list_cur_person = [2339, 859, 505]

# 计算新增列表最大值
print(max(list_add_person))
# 计算现有列表最小值
print(min(list_cur_person))
# 对新增列表进行求和
print(sum(list_add_person))
# 判断现有列表是否存在859
print(859 in list_cur_person)

3.5.1.2.基础操作
3.5.1.2.1.添加元素

列表名.append(元素)
列表.insert(索引,元素)

list_movie = ["电影1"] 
list_movie.append("电影2") 
list_movie.append("电影3") 
print(list_movie) # ["电影1","电影2","电影3"]

list_movie = ["电影1","电影2"]
list_movie.insert(0,"电影3")

练习1:
向地区、新增、现有三个列表中添加第四行信息
将第五行信息插入到地区、新增、现有三个列表中第一个位置

list_area = ["台湾", "陕西", "浙江"]
list_add_person = [16, 182, 2]
list_cur_person = [2339, 859, 505]

# 向地区、新增、现有三个列表中添加第四行信息
list_area.append("广西")
list_add_person.append(6)
list_cur_person.append(256)
# 将第五行信息插入到地区、新增、现有三个列表中第一个位置
list_area.insert(0, "香港")
list_add_person.insert(0, 9)
list_cur_person.insert(0, 196)

print(list_area)
print(list_add_person)
print(list_cur_person)

3.5.1.2.2. 定位元素

列表名[索引] = 元素
变量 = 列表名[索引]
变量 = 列表名[切片] # 赋值给变量的是切片所创建的新列表
列表名[切片] = 容器 # 右侧必须是可迭代对象,左侧切片没有创建新列表

list_movie = ["电影1","电影2","电影3"]
list_movie[0] = "电影4"

list_movie = ["电影1","电影2","电影3"]
list_movie[:2] = ["电影4","电影5"]

list_movie = ["电影1","电影2","电影3"]
list_new = list_movie[:2]

list_region = ["台湾","陕西","浙江"]
data01 = list_region
data02 = list_region[-2:]
data02[0] = "shan_xi"
print(list_region)
data01[0] = "tai_wan"
print(list_region)
3.5.1.2.3.删除元素

列表名.remove(元素)
del 列表名[索引或切片]

list_movie = ["电影1","电影2","电影3"]
del list_movie[0]
del list_movie[:2]
print(list_movie) # []

list_movie = ["电影1","电影2","电影3"]
list_movie.remove("电影2")
print(list_movie) # ["电影1","电影3"]
list_movie.remove("电影11") # 报错
3.5.1.2.4.遍历

(1)从头到尾读取

for 变量名 in 列表名:
	变量名
list_pop = [921109,826748,189298]
for item in list_pop:
if item > 500000:
print(item)

(2)从头到尾修改:

for 索引名 in range(len(列表名)):
	列表名[索引名]
list_pop = [921109,826748,189298]
for i in range(len(list_pop)):
if list_pop[i] > 500000:
list_pop[i] = 500000

练习:
打印新增列表小于10的元素
现有列表所有元素累加2

list_area = ["台湾", "陕西", "浙江"]
list_add_person = [16, 182, 2]
list_cur_person = [2339, 859, 505]

# 打印新增列表小于10的元素
for item in list_add_person:
    if (item < 10):
        print(item)

print("----------------------")

# 现有列表所有元素累加2
for i in range(len(list_cur_person)):
    list_cur_person[i] += 2
print(list_cur_person)

综合练习
八大行星:“水星” “金星” “地球” “火星” “木星” “土星” “天王星” “海王星”
– 创建列表存储4个行星:“水星” “金星” “火星” “木星”
– 插入"地球"、追加"土星" “天王星” “海王星”
– 打印距离太阳最近、最远的行星(第一个和最后一个元素)
– 打印太阳到地球之间的行星(前两个行星)
– 删除"海王星",删除第四个行星
– 打印所有行星(一行一个)

# "水星" "金星" "地球" "火星" "木星" "土星" "天王星" "海王星"
# -- 创建列表存储4个行星:“水星” "金星" "火星" "木星"
list_start = ["水星", "金星", "火星", "木星"]
# -- 插入 "地球"、追加"土星" "天王星" "海王星"
list_start.insert(4, "地球")
list_start.append("土星")
list_start.append("天王星")
list_start.append("海王星")
# -- 打印距离太阳最近、最远的行星(第一个和最后一个元素)
print("距离太阳最近:" + list_start[0] + ",最远的行星:" + list_start[len(list_start)-1])
# -- 打印太阳到地球之间的行星(前两个行星)
print("距离太阳最近:" + list_start[0] + ",最远的行星:" + list_start[1])
# -- 删除 "海王星", 删除第四个行星
list_start.remove("海王星")
del list_start[3]
# -- 打印所有行星(一行一个)
for item in list_start:
    print(item)

3.5.1.3.列表拷贝
3.5.1.3.1.为什么需要拷贝

(1)避免数据意外修改
有时候需要将可变数据传递给函数,并且希望函数对这个可变数据的操作不影响原始数据。
(2)保存数据原始快照
在某些情况下,需要创建一个相同状态的数据副本,以便之后可以对比或回滚到先前的状态。

3.5.1.3.2.什么是深拷贝

深拷贝复制所有层的数据,拷贝后的数据完全独立。

import copy
list_movie = ["电影1",["电影2","电影3"]]
list_new = copy.deepcopy(list_movie)
list_new[0] = "电影10"
list_new[1][1] = "电影11"
print(list_movie) # ['电影1', ['电影2', '电影3']]
3.5.1.3.3.什么是浅拷贝

浅拷贝复制第一层的数据,共享深层的数据。

list_movie = ["电影1",["电影2","电影3"]]
list_new = list_movie[:] # 切片触发浅拷贝
list_new[0] = "电影10"
list_new[1][1] = "电影11"
print(list_movie) # ['电影1', ['电影2', '电影11']]
3.5.1.3.4.深浅拷贝对比

深、浅拷贝是复制数据的两种方式。
深拷贝复制所有层的数据,拷贝后的数据完全独立。优点是修改数据时互不影响,缺点是占用内存较大。
浅拷贝复制第一层的数据,共享深层的数据。优点是占用内存较少,缺点是修改深层数据互相影响。
当需要拷贝的数据具有深层数据,建议使用深拷贝,否则使用浅拷贝。

import copy
list01 = ["北京",["上海","深圳"]]
list02 = list01
list03 = list01[:]
list04 = copy.deepcopy(list01)
list04[0] = "北京04"
list04[1][1] = "深圳04"
# 深拷贝,数据完全复制,数据独立
print(list01) # ['北京', ['上海', '深圳']]

list03[0] = "北京03"
list03[1][1] = "深圳03"
# 浅拷贝,仅复制第一层数据,底层共享
print(list01) # ['北京', ['上海', '深圳03']]

list02[0] = "北京02"
list02[1][1] = "深圳02"
# 普通拷贝,操作的是同一个对象
print(list01) # ['北京02', ['上海', '深圳02']]

3.5.1.4.列表推导式

需求:将大于60的元素存入新列表

# 传统代码
list_number = [66,25,72,86,57]
list_new = []
for item in list_number:
if item > 60:
list_new.append(item)
print(list_new) # [66,72,86]

# 推导式代码
list_new = [item for item in list_number if item > 60]

定义:通过简单的语法将可迭代对象转换为新列表
作用:简化代码,避免了传统循环结构的繁琐,提高代码的可读性
语法:

新列表 = [表达式 for 变量in 可迭代对象]
新列表 = [表达式 for 变量in 可迭代对象 if 条件]

案例:

# 将所有元素的个位存入新列表
list_number = [66,25,72,86,57]
list_new = [item % 10 for item in list_number]

适用性:
使用条件 => 根据可迭代对象、构建新列表、过程够简单
在这里插入图片描述

练习:
生成10–30之间能被3或者5整除的数字
结果:[10, 12, 15, 18, 20, 21, 24, 25, 27]
生成5 – 20之间的数字平方
结果:[25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361]

# 生成10--30之间能被3或者5整除的数字
# 结果:[10, 12, 15, 18, 20, 21, 24, 25, 27]
list1 = [item for item in range(10, 30) if item % 3 == 0 or item % 5 == 0]
print(list1)
# 生成5 -- 20之间的数字平方
# 结果:[25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361]
list2 = [item**2 for item in range(5, 20)]
print(list2)

3.5.2.元组tuple

在Python中可以使用元组,存储不会变化的多个数据。
定义:由一系列变量组成的不可变序列容器。
语法:

元组名 = (元素1,元素2)

tuple_type = (“剧情”,“动作”)

与列表区别
元组用于存储无需变化的数据,所以采用"按需分配"的存储机制
列表用于存储需要变化的数据,所以采用"预留空间"的存储机制
在这里插入图片描述

可变数据为什么可变
存储机制:预留空间 + 自动扩容
自动扩容:开辟更大空间、拷贝原始数据、替换内存地址

不可变数据如何变化
每次变化都会产生新数据
tuple_type = (“剧情”,“动作”)
tuple_type += (“惊悚”,“科幻”)

3.5.2.1.基础操作
3.5.2.1.1.创建元组

元组名 = (元素1,元素2)
元组名 = 元素1,元素2 # 没有歧义时也可以省略小括号
元组名 = (元素1,) # 只有一个元素时必须添加逗号
name = “悟空”, # 小心:是元组不是字符串

3.5.2.1.2.定位元素

变量 = 元组名[索引]
变量 = 元组名[切片] # 创建新元组
tuple_type = (“剧情”,“动作”,“科幻”)
print(tuple_type[0]) # “剧情”
print(tuple_type[:2]) # (“剧情”,“动作”)

3.5.2.1.3.遍历元组

从头到尾读取满足条件的元素

for 变量名 in 元组名:
	变量名
tuple_pop = (921109, 826748, 189298)
for item in tuple_pop:
    if item > 500000:
        print(item)
3.5.2.1.4.序列拆包

定义:将序列元素分配给多个变量的操作
作用:操作序列元素更方便,代码更简洁
语法:变量名1,变量名2 = 序列
a,b,c = [“王宝强”,“周润发”,“王学兵”]
a,b,c = (“王宝强”,“周润发”,“王学兵”)
练习:
根据月日,计算是这一年的第几天.
公式:前几个月总天数 + 当月天数
例如:5月10日
计算:31 29 31 30 + 10

# 1 3 5 7 8 10 12 有31天
# 2 有29天
# 4 6 9 11 有30天
tuple_mon = (31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
cur_mon = int(input("请输入月:"))
cur_day = int(input("请输入日:"))
sum_day = 0
for i in range(cur_mon - 1):
    sum_day += int(tuple_mon[i])
sum_day += cur_day
print(str(cur_mon) + "月" + str(cur_day) + "日是这一年的第" + str(sum_day) + "天")

3.5.3.字符串str

由一系列字符编码值组成的不可变序列容器
在这里插入图片描述

3.5.3.1.编码
3.5.3.1.1.字符集
在这里插入图片描述
字符与整数对应关系的集合
(1) ASCII:包含英文、数字等字符
(2) GBK:兼容ASCII,包含21886个中文
(3) Unicode:几乎涵盖全球所有已知字符

3.5.3.1.2.编码方式

将字符转换为整数的规则
(1) ASCII:每个字符占1个字节
(2) GBK:英文1个字节,中文2个字节
(3) UTF8:英文1个字节,中文3个字节

3.5.3.1.3.不可变

采取"按需分配"的存储策略,节省内存空间
修改数据时若在原有空间,可能破坏其他数据
所以每次修改都会创建新数据,替换变量中记录的数据地址
name = “封神”
name = “封神第一部”
name = “电影” + name
在这里插入图片描述

3.5.3.2.序列

在这里插入图片描述
使用比较运算符时会依次比较两个容器中元素,一但不同则返回结果
print(“12w” < “13w”) # True
print(“2k” < “13w”) # False
在这里插入图片描述

3.5.3.3.字面值
3.5.3.3.1.单引和双引号的区别

(1) 单引号内的双引号不算结束符
(2) 双引号内的单引号不算结束符

print('悟空')  #悟空
print("悟空")  #悟空
print('花果山"水帘洞"美猴王孙悟空')  #花果山"水帘洞"美猴王孙悟空
print("""花果山'水帘洞'"美猴王"孙悟空""")  #花果山'水帘洞'"美猴王"孙悟空
3.5.3.3.2.三引号作用

(1) 换行会自动转换为换行符\n
(2) 三引号内可以包含单引号和双引号
(3) 作为文档字符串

3.5.3.3.3.转义字符

(1) 定义:改变字符的原始含义。
(2) 语法: ’ " \n \

print("花果山\"水帘洞\"美猴王孙悟空") # 花果山"水帘洞"美猴王孙悟空
print("花果山水帘洞\n美猴王孙悟空") 
# 花果山水帘洞
# 美猴王孙悟空
print("C:\\newfile\\test.py")  #  C:\newfile\test.py

(3) 原始字符串:取消转义(小写字母r开头)。

print(r"C:\newfile\test.py")
3.5.3.3.4.格式化

(1) 作用:将变量插入到字符串时,可以先用占位符描述格式后插入变量
(2) 占位符:%s 原样输出, %d 整数保留位数, %f 小数保留精度
(3) 语法:格式%(变量)

name = "大圣"
age = "6"
money = 1.2345
hour = 2
minute = 6
print("我叫%s,今年%s岁啦" % (name, age)) # 我叫大圣,今年6岁啦
print("请支付:%.2f元" % money) # 请支付:1.23元
print("%.2d:%.2d" % (hour,minute)) # 02:06

练习:根据下列文字,提取变量,使用字符串格式化打印信息
湖北确诊67802人,治愈63326人,治愈率0.93
65秒是01分05秒

# 湖北确诊67802人,治愈63326人,治愈率0.93
num1 = 67802
num2 = 63326
num3 = 0.93
print("湖北确诊%d人,治愈%d人,治愈率%.2f" % (num1, num2, num3))
# 65秒是01分05秒
sec1 = 65
min = 1
sec2 = 5
print("%d秒是%.2d分%.2d秒" % (sec1, min, sec2))

3.5.4.字典dict

适合存储有对应关系的数据,例如表格的标题名与行数据。
在这里插入图片描述

若用列表存储电影信息,通过索引访问,代码可读性差。

list_movie01 = ["八角笼中","剧情","王宝强"690761)]
print("名称" + list_movie01[0])
print("类型" + list_movie01[1])
print("演员" + list_movie01[2])
print("指数" + list_movie01[3])

(1)定义:由一系列键值对组成的可变散列容器
(2)语法:

字典名 = {1:,2:}

(3)案例:

dict_bjlz = {
"name":"八角笼中","type":"剧情",
"actor":"王宝强","index":690761,
}
print("名称" + dict_bjlz["name"])
3.5.4.1.散列

(1)定义:通过哈希算法将键转换为对应存储位置的容器类型
(2)特点:
①:无需遍历,直接计算存储位置,速度最快

list_movie = [("八角笼中","剧情"),("消失的她","犯罪")]
for item in list_movie:
if item[0] == "消失的她":
print(item[1])
dict_movie = {"八角笼中":"剧情","消失的她":"犯罪"}
print(dict_movie["消失的她"])

②:键必须唯一且只能是不可变类型的数据

dict_movie = {"剧情":"八角笼中","剧情":"满江红"}
print(dict_movie)  # {"剧情":"满江红"}
dict_movie = {["王宝强","陈永胜"]:"八角笼中"} # TypeError: unhashable type: 'list'

③缺点:在内存中元素没有顺序且占用空间较大
在这里插入图片描述
练习:
创建字典存储台湾的地区、新增、现有人数
创建字典存储陕西的地区、新增、现有人数
创建字典存储浙江的地区、新增、现有人数
在这里插入图片描述

dict_tw = {"地区": "台湾", "新增": 16, "现有": 2339}
dict_sx = {"地区": "陕西", "新增": 182, "现有": 859}
dict_zj = {"地区": "浙江", "新增": 2, "现有": 505}
3.5.4.2.基础操作
3.5.4.2.1.添加元素

(1)作用:将键值对添加到字典中
(2)语法:字典名[键] = 值
(3)案例:

dict_bjlz = {
"name":"八角笼中","type":"剧情",
}
dict_bjlz["actor"] = "王宝强"
dict_bjlz["index"] = 690761

练习:根据表格数据,为台湾、陕西、浙江三个字典添加累计、治愈人数

dict_tw = {"地区": "台湾", "新增": 16, "现有": 2339}
dict_sx = {"地区": "陕西", "新增": 182, "现有": 859}
dict_zj = {"地区": "浙江", "新增": 2, "现有": 505}
dict_tw["累计"] = 16931
dict_tw["治愈人数"] = 13742
dict_sx["累计"] = 1573
dict_sx["治愈人数"] = 711
dict_zj["累计"] = 2008
dict_zj["治愈人数"] = 1502
3.5.4.2.2.定位元素

(1)作用:改变或读取字典中某个键对应的值
(2)语法:字典名[键] = 值
值 = 字典名[键]
(3)案例:

dict_bjlz = {
"name":"八角笼中","type":"剧情",
}
dict_bjlz["name"] = "封神第一部"
dict_bjlz["type"] = "战争"
print(dict_bjlz["name"])
type = dict_bjlz["type"]

注意:键存在为修改,不存在为添加
练习:
在终端中打印台湾的现有人数
在终端中打印陕西的新增和现有人数
浙江新增和现有人数各增加1

dict_tw = {"地区": "台湾", "新增": 16, "现有": 2339}
dict_sx = {"地区": "陕西", "新增": 182, "现有": 859}
dict_zj = {"地区": "浙江", "新增": 2, "现有": 505}
print(dict_tw["现有"])
print(dict_sx["新增"])
print(dict_sx["现有"])
dict_zj["新增"] += 1
dict_zj["现有"] += 1
3.5.4.2.3.删除元素

(1)作用:通过键删除键值对
(2)语法:del 字典名[键]
(3)案例:

dict_bjlz = {
"name":"八角笼中","type":"剧情",
}
del dict_bjlz["name"])

注意:列表删除时元素向前移动,字典删除时其他元素不移动
练习:
删除台湾现有信息
删除陕西新增和现有信息
删除浙江现有人数保留键(通过键修改值)

dict_tw = {"地区": "台湾", "新增": 16, "现有": 2339}
dict_sx = {"地区": "陕西", "新增": 182, "现有": 859}
dict_zj = {"地区": "浙江", "新增": 2, "现有": 505}

del dict_tw["现有"]
del dict_sx["新增"]
del dict_sx["现有"]
dict_zj["现有"] = ""
3.5.4.3.遍历元素

所有键
(1)作用:获取字典中所有键
(2)语法:

for key in 字典名:
	变量key记录的是字典键 

(3)案例:
dict_bjlz = {
“name”:“八角笼中”,“type”:“剧情”,
}
for key in dict_bjlz:
print(key)

所有值
(1)作用:获取字典中所有值
(2)语法:

for value in 字典名.values(): 
	变量value记录的是字典值

(3)案例:

dict_bjlz = {
"name":"八角笼中","type":"剧情",
}
for value in dict_bjlz.values():
print(value)
``


**所有键和值**
(1)作用:获取字典中所有值
(2)语法:
```python
for key,value in 字典名.items(): 
	变量key,value分别记录的是字典的键和值

(3)案例:

dict_bjlz = {
"name":"八角笼中","type":"剧情",
}
for key,value in dict_bjlz.items():
print(key)
print(value)

练习:
在终端中打印台湾所有键(一行一个)
在终端中打印陕西所有值(一行一个)
在终端中打印浙江所有键和值(一行一个)
在台湾字典中查找值是2339对应的键名称

dict_tw = {"地区": "台湾", "新增": 16, "现有": 2339}
dict_sx = {"地区": "陕西", "新增": 182, "现有": 859}
dict_zj = {"地区": "浙江", "新增": 2, "现有": 505}

# 在终端中打印台湾所有键(一行一个)
for key in dict_tw:
    print(key)
# 在终端中打印陕西所有值(一行一个)
for val in dict_sx.values():
    print(val)
# 在终端中打印浙江所有键和值(一行一个)
for key, val in dict_zj.items():
    print(str(key) + ":" + str(val))
# 在台湾字典中查找值是2339对应的键名称
for key, val in dict_tw.items():
    if val == 2339:
        print("值是2339对应的键名称:" + key)

3.5.4.4.字典推导式

(1)定义:通过简单的语法将可迭代对象转换为新字典
(2)作用:简化代码,避免了传统循环结构的繁琐,提高代码的可读性
(3)语法:

新字典 = {:for 变量 in 可迭代对象}
新字典 = {:for 变量 in 可迭代对象 if 条件}

(4)案例:将2个列表合并为一个字典

list_name = ["八角笼中","封神第1部","消失的她"]
list_pop = [921109,826748,189298]
dict_movie = {
list_name[i]:list_pop[i] for i in range(len(list_name))

(5)适用条件:根据可迭代对象、构建新字典、过程够简单
6)不适用:

# 不支持while
dict_new = {}
while True:
	item = input("请输入:")
	dict_new[item] = item * 2
# 必须是空字典
dict_new = {5:25}
for num in range(5):
	dict_new[num] = num * 2
# 不能有多余代码
dict_new = {}
	for num in range(5):
dict_new[num] = num * 2
	print(num)

练习:使用字典推导式,颠倒字典的键和值

dict_info = {
"1001":"台湾","1002":"陕西",
"1003":"浙江","1004":"广西",
}
dict_info = {
    "1001": "台湾", "1002": "陕西",
    "1003": "浙江", "1004": "广西",
}
new_dict_info = {val: key for key, val in dict_info.items()}

3.5.5.容器嵌套

3.5.5.1.字典内嵌元组

数据
在这里插入图片描述

代码

dict_bjlz = {
"name":"八角笼中","type":("剧情","动作"),
"actor":"王宝强","index":690761,
}
print("名称" + str(dict_bjlz["type"])) # 名称('剧情', '动作')
3.5.5.2.列表内嵌字典

数据
在这里插入图片描述

代码

list_movie = [
    {"name": "八角笼中", "index": 690761},
    {"name": "封神第一部", "index": 532622}
]
print(list_movie[0])  # {"name":"八角笼中","index":690761}
print(list_movie[1]["name"])  # "封神第一部"

基础操作
list_movie = [
{“name”:“八角笼中”,“index”:690761},
{“name”: “封神第一部”,“index”: 532622}
]

# 1. 添加
dict_movie = {"name":"消失的她","index":446700}
list_movie.append(dict_movie)
# 2. 定位
# 2.1 读取
for item in list_movie:
print("电影名:%s,热搜指数:%s"%(item["name"],item["index"]))
# 2.2 修改
for item in list_movie:
list_movie[i]["index"] += 10
# 3. 删除
for i in range(len(list_movie)):
if list_movie[i]["name"] == "八角笼中":
del list_movie[i]
break

3.6.函数 function

需求:修改多个游戏场景中角色攻击的代码,需要重复修改多次
在这里插入图片描述

函数作用:将功能的做法与用法分离,需求变化时只需要修改一次做法
创建语法:

def 函数名():

语句组
def关键字:全称是define,意为"定义"
函数名:对函数体中语句的描述,规则与变量名相同,建议使用动词
函数体:完成该功能的语句
调用语法:
函数名()
若没有小括号,函数不执行
通常先定义函数,再调用函数

为提高代码复用性:如果在程序中有一段代码需要在多个地方使用,可以将其定义在一个函数中,以便在需要时重复调用。
为提高代码可读性:将复杂的代码逻辑拆分成较小的函数,可以提高代码的可读性。函数有明确的名称和参数,可以使代码更加清晰易懂。
为提高代码安全性:将敏感操作或复杂计算定义在函数内部,避免在其他部分直接访问或修改实现细节,可以使代码更加安全。

3.6.1.语法

3.6.1.1.定义函数

语法:

def 函数名(形式参数):
	函数体

函数的第一行语句建议使用文档字符串描述函数的功能与参数。

# 形式参数:表面的不具体的数据
def attack(count):
"""
攻击
:param count:次数
"""
for __ in range(count):
print("直拳")
print("摆拳")
print("勾拳")
3.6.1.2.调用函数

语法:函数名(实际参数)
说明:根据形参传递内容。

# 实际参数:真实的具体的数据
attack(5)
attack(2)

练习: 定义函数,在终端中打印一维列表

list01 = [5, 546, 6, 56, 76 ]
for item in list01:
print(item)
list02 = [7,6,879,9,909]
for item in list02:
print(item)
def printList(lists):
    for item in lists:
        print(item)


list01 = [5, 546, 6, 56, 76]
printList(list01)
list02 = [7, 6, 879, 9, 909]
printList(list02)
3.6.1.3.返回值

定义:
函数定义者告诉调用者的结果。
语法:
return 数据
说明:
return后没有语句,相当于返回 None。
函数体没有return,相当于返回None。

def func01():
	print("func01执行了")
	return 100
# 1. 调用者,可以接收也可以不接收返回值
func01()
res = func01()
print(res)

# 2.在Python语言中,
# 函数没有return或return后面没有数据,
# 都相当于return None
def func02():
	print("func02执行了")
	return
res = func02()
print(res) # None

# 3.return可以退出函数
def func03():
	print("func03执行了")
	return
print("func03又执行了")
func03()

# 4. return 可以退出多层循环嵌套
def func04():
	while True:
		while True:
			while True:
				# break 只能退出一层循环
				print("循环体")
				return
func04()

练习1:创建计算治愈比例的函数

confirmed = int(input("请输入确诊人数:"))
cure = int(input("请输入治愈人数:"))
cure_rate = cure / confirmed * 100
print("治愈比例为" + str(cure_rate) + "%")
def heal(confirmed, cure):
    return cure / confirmed * 100

confirmed = int(input("请输入确诊人数:"))
cure = int(input("请输入治愈人数:"))
print("治愈比例为" + str(heal(confirmed, cure)) + "%")

练习2:定义函数,根据总两数,计算几斤零几两.:
提示:使用容器包装需要返回的多个数据

total_liang = int(input("请输入两:"))
jin = total_liang // 16
liang = total_liang % 16
print(str(jin) + "斤零" + str(liang) + "两")
def compWeight(weg):
    jin = weg // 16
    liang = weg % 16
    print(str(jin) + "斤零" + str(liang) + "两")

weight = int(input("请输入两:"))
compWeight(weight)

练习3:创建函数,根据课程阶段计算课程名称.

number = input("请输入课程阶段数:")
if number == "1":
	print("Python语言核心编程")
elif number == "2":
	print("Python高级软件技术")
elif number == "3":
	print("Web全栈")
elif number == "4":
	print("人工智能")
def getClassName(num):
    if num == "1":
        print("Python语言核心编程")
    elif num == "2":
        print("Python高级软件技术")
    elif num == "3":
        print("Web全栈")
number = input("请输入课程阶段数:")
getClassName(number)

练习4:创建函数,计算IQ等级

ma = int(input("请输入你的心里年龄:"))
ca = int(input("请输入你的实际年龄:"))
iq = ma / ca * 100
if iq>= 140:
	print("天才")
elif iq >= 120:
	print("超常")
elif iq >= 110:
	print("聪慧")
elif iq >= 90:
	print("正常")
elif iq >= 80:
	print("迟钝")
else:
	print("低能")
def compIQ(ma, ca):
    iq = ma / ca * 100
    if iq >= 140:
        print("天才")
    elif iq >= 120:
        print("超常")
    elif iq >= 110:
        print("聪慧")
    elif iq >= 90:
        print("正常")
    elif iq >= 80:
        print("迟钝")
    else:
        print("低能")


ma = int(input("请输入你的心里年龄:"))
ca = int(input("请输入你的实际年龄:"))
compIQ(ma, ca)

3.6.2.可变/不可变类型在传参时的区别

(1) 不可变类型参数有:
数值型(整数,浮点数)
布尔值bool
None 空值
字符串str
元组tuple
(2) 可变类型参数有:
列表 list
字典 dict
(3) 传参说明:
不可变类型的数据传参时,函数内部不会改变原数据的值。
可变类型的数据传参时,函数内部可以改变原数据。

练习1:写出打印结果。

def func01(p1, p2):
	p1 = "孙悟空"
	p2["八戒"] += 50
a = "悟空"
b = {"八戒": 100}

func01(a, b)
print(a) # 悟空
print(b) # {'八戒': 150}

练习2:并写出打印结果。

def func01(p1, p2):
	p1 = 100
	p2[0] = 200
a = [10]
b = [20]
func01(a, b)
print(a) # [10]
print(b) # [200]

3.6.3.函数参数

3.6.3.1.实参传递方式argument
3.6.3.1.1.位置实参

定义:实参与形参的位置依次对应。

def fun01(p1, p2, p3):
	print(p1)
	print(p2)
	print(p3)

# 位置实参:根据顺序与形参进行对应
fun01(1, 2, 3)
3.6.3.1.2.关键字实参

定义:实参根据形参的名字进行对应。

def fun01(p1, p2, p3):
	print(p1)
	print(p2)
	print(p3)
# 关键字实参:根据名字与形参进行对应
fun01(p1=1, p2=2, p3=3)
fun01(p2=2, p1=1, p3=3)
3.6.3.1.3.序列实参

定义:实参用*将序列拆解后与形参的位置依次对应。

3.6.3.1.4.字典实参

定义:实参用**将字典拆解后与形参的名字进行对应。

3.6.3.2.形参定义方式parameter
3.6.3.2.1.位置形参
语法:
def 函数名(形参名1, 形参名2, ...):
	函数体
3.6.3.2.2.默认形参

语法:

def 函数名(形参名1=默认值1, 形参名2=默认值2, ...):
	函数体

说明:
默认参数必须自右至左依次存在,如果一个参数有默认值,则其右侧的所有参数都必须有默认值。

def func01(p1 =0, p2="", p3=100):
	print(p1)
	print(p2)
	print(p3)
func01(p2=2)
func01(p2=2,p3=3)
# 支持同时使用位置实参与关键字实参
func01(1,p3=3)
# 注意:先位置实参,后关键字实参
# func01(p1 =1,2,3) # 错误

练习:
定义函数,根据小时、分钟、秒,计算总秒数
调用:提供小时、分钟、秒
调用:提供分钟、秒
调用:提供小时、秒
调用:提供分钟

# 定义函数,根据小时、分钟、秒,计算总秒数
def compSec(hour=0, min=0, sec=0):
    return hour * 3600 + min * 60 + sec


# 调用:提供小时、分钟、秒
print(str(compSec(1, 10, 10)))
# 调用:提供分钟、秒
print(str(compSec(min=10, sec=10)))
# 调用:提供小时、秒
print(str(compSec(hour=1, sec=10)))
# 调用:提供分钟
print(str(compSec(min=10)))

3.6.3.2.3.星号元组形参

语法:

def 函数名(*元组形参名):
	函数体

作用:
收集多余的位置传参。
说明:
一般命名为’args’
形参列表中最多只能有一个

3.6.3.2.4.双星号字典形参

语法:

def 函数名(**元组形参名):
	函数体

作用:
收集多余的关键字传参
说明:
一般命名为’kwargs’
形参列表中最多只能有一个

3.6.3.2.5.命名关键字形参

语法:
def 函数名(命名关键字形参1, 命名关键字形参2, …):
函数体

3.6.3.3.参数顺序

形式参数:位置形参 --> 星号元组形参 --> 命名关键字形参 --> 双星号字典形参
实际参数:位置实参 --> 关键字实参

3.7.作用域

定义:变量起作用的范围。
分类:
(1) Local局部作用域:函数内部。
(2) Global全局作用域:模块(.py文件)内部。
变量名的查找规则:在访问变量时,先查找局部变量,之后是全局变量。
局部变量:
(1) 定义在函数内部的变量(形参也是局部变量)
(2) 只能在函数内部使用
(3) 调用函数时才被创建,函数结束后自动销毁
全局变量:
(1) 定义在函数外部,模块内部的变量。
(2) 在整个模块(py文件)范围内访问(但函数内不能将其直接赋值)。
global 语句:
(1) 作用:
在函数内部修改全局变量。
在函数内部定义全局变量(全局声明)。
(2) 语法:
global 变量1, 变量2, …
(3) 说明
在函数内直接为全局变量赋值,视为创建新的局部变量。
不能先声明局部的变量,再用global声明为全局变量。

# 2.全局作用域:文件内部
# 全局变量:在全部作用域内创建的变量
# 适用范围:整个文件
data02 = 20
data03 = [30]

def func01():
	# 1. 局部作用域:函数内部
	# 局部变量:在局部作用域内创建的变量
	# 适用范围:一个函数
	data01 = 10
	print(data01)
	print(data02)
def func02():
	# print(data01) # 不能访问其他函数局部变量
	print(data02) # 读取全局变量
def func03()
	# 在局部作用域中不能修改全局变量
	# data02 = 200
	# 必须通过global语句声明
	global data02
	data02 = 200
def func04():
	# 没有修改全局变量
	# 在修改全局变量指向的列表
	# 所以不需要通过global语句声明
	data03[0] = 300
func01()
func02()
func03()
func04()
print(data02)  #  200
print(data03)  # [300]
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值