python_笔记

python考试函数

  • pow()函数

    Python的内置函数,它计算并返回x的y次方的值。
    语法 pow(x, y, z)
    参数 x -- 数值表达式。 y -- 数值表达式。 z -- 数值表达式。
    python的根号只有具体值不会带根号,比如pow(3,0.5)*pow(3,0.5)=2.9999999999999996
    
  • enumerate(iteration, start)函数

    默认包含两个参数,其中iteration参数为需要遍历的参数,比如字典、列表、元组等,start参数为开始的参数,默认为0(不写start那就是从0开始)。enumerate函数有两个返回值,第一个返回值为从start参数开始的数,第二个参数为iteration参数中的值。
    
  • reverse()函数

    是python中列表的一个内置方法(在字典、字符串和元组中没有这个内置方法),用于列表中数据的反转,reverse()方法没有返回值,但是会对列表的元素进行反向排序。
    
  • reserved() 是 Pyton 内置函数之一,其功能是对于给定的序列(包括列表、元组、字符串以及 range(n) 区间),该函数可以返回一个逆序序 列的迭代器(用于遍历该逆序序列)

  • **items()**函数以列表返回可遍历的(键, 值)

  • capitalize()函数 描述:将字符串的第一个字母变成大写,其余字母变为小写。

  • **append()**函数可以向列表末尾添加元素 语法 list.append(element)

  • replace() 函数有两种使用形式,一种是简单替换,即使用新字符串替换原字符串中全部与之匹配的子串;另外一种是在替换中指定替换的次数。

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GkdTpKhY-1680859355450)(python.assets/image-20230407171958476-16808593238808.png)]

    filter函数会过滤掉0,即保留非零的元素

    迭代器顺序读取

  • **find()**的作用

    在python内的find函数是只能用在字符串类型的对象上的,它的作用是去在这个字符串内查找是否有指定的字符串。如果有的话就返回子字符串第一次出现的首个字符索引,没有的话就会返回一个数字**-1**,在进行数据处理的时候也会使用到这个函数。

  • contains方法用途 contains 方法可以判断子串是否在原字符串中。

  • copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象

  • itertools.chain() 方法可以用来简化这个任务。 它接受一个可迭代对象列表作为输入,
    并返回一个迭代器,有效的屏蔽掉在多个容器中迭代细节。

  • **isinstance()**是Python中的一个内建函数。是用来判断一个对象的变量类型。

  • listdir()方法返回一个列表,其中包含由path指定的目录中的条目的名称。 列表是任意顺序的。它不包括特殊条目’.‘ 和’..‘,即使它们存在于目录中。

  • **join()**连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串

  • 在Python中,split函数的基本用法是将字符串按照指定的规则或者要求进行分割,并返回list值

  • raise抛出异常,Exception自定义异常,raise Exception("AAA")

  • >>和<<为位运算
    <<  :是左移动运算符,运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补0。 
    
    >> :右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数
    
  • *Python字符串也提供区间访问方式,采用[N:M]格式,表示字符串中从N到M(*不包含M)

  • format用法:format()功能很强大,它把字符串当成一个模板,通过传入的参数进行格式化,并且使用大括号‘{}’作为特殊字符代替‘%’。

  • **get()**函数利用键来获取值

  • |运算是二进制相或,&运算是二进制相与

  • Python pass 是空语句,是为了保持程序结构的完整性。

    pass 不做任何事情,一般用做占位语句。

  • image-20221205105813548

    特别注意“r+”和“w+”之间的区别,*二者都可以读和写**“r+”打开文件时,不会删除原有文件内容*,写入时,如果原有位置有内容,则进行覆盖;而****“w+”打开文件时,会先删除原有文件内容****。

  • reduce用法 对列表元素求和,不是内置函数,在python3中被移到functools模块中

  • os.startfile 函数 如果我们想达到类似文件浏览器双击打开一个文件的效果可以使用os.startfile函数

  • title函数

    python中字符串函数,返回’标题化‘的字符串,就是单词的开头为大写,其余为小写

  • sorted() 作为 Python 内置函数之一,其功能是对序列(列表、元组、字典、集合、还包括字符串)进行排序。

    sorted() 函数的基本语法格式如下:

    list = sorted(iterable, key=None, reverse=False)

    其中,iterable 表示指定的序列,key 参数可以自定义排序规则;reverse 参数指定以升序(False,默认)还是降序(True)进行排序。sorted() 函数会返回一个排好序的列表。

  • callable() 函数用于检查一个对象是否是可调用的。

  • sqrt()是用于计算数字x的平方根的函数

  • rfind() 返回字符串最后一次出现的位置,如果没有匹配项则返回 -1。

  • bin()函数 是python的一个内置函数,主要功能是返回整形(int)或者长整形(long int)的二进制表示;

  • choice() 函数 返回一个列表,元组或字符串的随机项

  • sample函数 sample(序列a,n) sample(序列a,n) 功能:从序列a中随机抽取n个元素,并将n个元素生以list形式返回

  • setattr() 函数对应函数 getattr(),用于设置属性值,该属性不一定是存在的。

setattr(object, name, value)
object -- 对象。
name -- 字符串,对象属性。
value -- 属性值。

PyCharm

一. PyCharm的作用

PyCharm是一种Python IDE(集成开发环境),带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,内部集成的功能如下:

  • Project管理
  • 智能提示
  • 语法高亮
  • 代码跳转
  • 调试代码
  • 解释代码(解释器)
  • 框架和库

PythonCharm分为专业版(professional)和社区版(community),本视频以社区版为基准进行操作和讲解。

二. 下载和安装

2.1 下载

下载地址:http://www.jetbrains.com/pycharm/download/#section=windows

image-20190110172355909

注意:这里选择Community(社区版)下载,专业版是收费版本,社区版可以满足我们基础编程需求。

2.2 安装

双击安装包 – [运行] – [允许你应用更改设备]: [是] – [Next] – [选择安装位置] – [Next] – [Install] – [Finish]。

image-20190108112855414

三. PyCharm基本使用

3.1 新建项目

打开PyCharm – [Create New Project] – 选择项目根目录和解释器版本 – [Create],即可完成新建一个项目。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LA6dsBY8-1680859355453)(https://gitee.com/Kawhildh/blog-image/raw/master/python/image-20190102112309128-6399389.png)]

3.2 新建文件并书写代码

项目根目录或根目录内部任意位置 — 右键 – [New] – [Python File] – 输入文件名 – [OK]

如果是将来要上传到服务器的文件,那么文件名切记不能用中文。

image-20190102114520725

双击打开文件,并书写一个最简单的Python代码:

print("hello world")

3.3 运行文件

文件打开状态 – 空白位置 — 右键 – Run – 即可调出Pycharm的控制台输出程序结果。

image-20190102122728572

四. PyCharm的基本设置

[file] – [Settings]/[Default Settings]。

image-20220221170441850

4.1 修改主题

[Appearance & Behavior] – [Appearance]

image-20220221170458507

  • Theme:修改主题
  • Name:修改主题字体
  • Size:修改主题字号

4.2 修改代码文字格式

[Editor] – [Font]

  • Font:修改字体
  • Size:修改字号
  • Line Spacing:修改行间距

4.3 修改解释器

[Project: 项目名称] – [Project Interpreter] – [设置图标] – [Add] – 浏览到目标解释器 – [OK] – [OK]。

4.4 项目管理

4.4.1 打开项目

[File] – [Open] – 浏览选择目标项目根目录 – [OK] – 选择打开项目方式。

打开项目的方式共三种,分别如下:

image-20190115095119315

  1. This Window

覆盖当前项目,从而打开目标项目

  1. New Window

在新窗口打开,则打开两次PyCharm,每个PyCharm负责一个项目。

image-20220221170554730

  1. Attach

image-20220221170608038

4.4.2 关闭项目

[File] – [Close Project]/[Close Projects in current window]

总结

  • PyCharm新建文件

项目管理空白位置 — 右键 – New – PythonFile

  • 运行文件

代码内部 — 右键 – Run

  • 修改代码文字格式

[file] – [Settings]/[Default Settings] – [Editor] – [Font]

注释

一. 注释的作用

  • 没有注释的代码

  • 添加注释的代码

  • 通过用自己熟悉的语言,在程序中对某些代码进行标注说明,这就是注释的作用,能够大大增强程序的可读性。

二. 注释的分类及语法

注释分为两类:单行注释多行注释

  • 单行注释

只能注释一行内容,语法如下:

# 注释内容
  • 多行注释

可以注释多行内容,一般用在注释一段代码的情况, 语法如下:

"""
	第一行注释
	第二行注释
	第三行注释
"""

'''
	注释1
	注释2
	注释3
'''

快捷键: ctrl + /

2.1 快速体验

  • 单行注释
# 输出hello world
print('hello world')

print('hello Python')  # 输出(简单的说明可以放到一行代码的后面,一般习惯代码后面添加两个空格再书写注释文字)
  • 多行注释
"""
    下面三行都是输出的作用,输出内容分别是:
    hello Python
    hello itcast
    hello itheima
"""
print('hello Python')
print('hello itcast')
print('hello itheima')


'''
    下面三行都是输出的作用,输出内容分别是:
    hello Python
    hello itcast
    hello itheima
'''
print('hello Python')
print('hello itcast')
print('hello itheima')

注意:解释器不执行任何的注释内容。

总结

  • 注释的作用

用人类熟悉的语言对代码进行解释说明,方便后期维护。

  • 注释的分类
    • 单行: # 注释内容,快捷键ctrl+/
    • 多行:""" 注释内容 """''' 注释内容 '''
  • 解释器不执行注释内容

变量

一. 变量的作用

image-20220221171903695

举例体验:我们去图书馆读书,怎么样快速找到自己想要的书籍呢?是不是管理员提前将书放到固定位置,并把这个位置进行了编号,我们只需要在图书馆中按照这个编号查找指定的位置就能找到想要的书籍。

这个编号其实就是把书籍存放的书架位置起了一个名字,方便后期查找和使用。

程序中,数据都是临时存储在内存中,为了更快速的查找或使用这个数据,通常我们把这个数据在内存中存储之后定义一个名称,这个名称就是变量。

image-20190122123202213

变量就是一个存储数据的的时候当前数据所在的内存地址的名字而已。

二. 定义变量

变量名 =

变量名自定义,要满足标识符命名规则。

2.1 标识符

标识符命名规则是Python中定义各种名字的时候的统一规范,具体如下:

  • 由数字、字母、下划线组成
  • 不能数字开头
  • 不能使用内置关键字
  • 严格区分大小写
False     None    True   and      as       assert   break     class  
continue  def     del    elif     else     except   finally   for
from      global  if     import   in       is       lambda    nonlocal
not       or      pass   raise    return   try      while     with  
yield

2.2 命名习惯

  • 见名知义。
  • 大驼峰:即每个单词首字母都大写,例如:MyName
  • 小驼峰:第二个(含)以后的单词首字母大写,例如:myName
  • 下划线:例如:my_name

2.3 使用变量

my_name = 'TOM'
print(my_name)

schoolName = '黑马程序员'
print(schoolName)

2.4 认识bug

所谓bug,就是程序中的错误。如果程序有错误,需要程序员排查问题,纠正错误。

image-20190115125845015

三. Debug工具

Debug工具是PyCharm IDE中集成的用来调试程序的工具,在这里程序员可以查看程序的执行细节和流程或者调解bug。

Debug工具使用步骤:

  1. 打断点
  2. Debug调试

3.1 打断点

  • 断点位置

目标要调试的代码块的第一行代码即可,即一个断点即可。

  • 打断点的方法

单击目标代码的行号右侧空白位置。

image-20190115130541289

3.2 Debug调试

打成功断点后,在文件内部任意位置 — 右键 – Debug’文件名’ — 即可调出Debug工具面板 – 单击Step Over/F8,即可按步执行代码。

image-20190115130809100

3.2.1 Debug输出面板分类

  • Debugger
    • 显示变量和变量的细节
  • Console
    • 输出内容

四. 认识数据类型

在 Python 里为了应对不同的业务需求,也把数据分为不同的类型。

image-20190111124628584

检测数据类型的方法:type()

a = 1
print(type(a))  # <class 'int'> -- 整型

b = 1.1
print(type(b))  # <class 'float'> -- 浮点型

c = True
print(type(c))  # <class 'bool'> -- 布尔型

d = '12345'
print(type(d))  # <class 'str'> -- 字符串

e = [10, 20, 30]
print(type(e))  # <class 'list'> -- 列表

f = (10, 20, 30)
print(type(f))  # <class 'tuple'> -- 元组

h = {10, 20, 30}
print(type(h))  # <class 'set'> -- 集合

g = {'name': 'TOM', 'age': 20}
print(type(g))  # <class 'dict'> -- 字典

总结

  • 定义变量的语法
变量名 =
  • 标识符
    • 由数字、字母、下划线组成
    • 不能数字开头
    • 不能使用内置关键字
    • 严格区分大小写
  • 数据类型
    • 整型:int
    • 浮点型:float
    • 字符串:str
    • 布尔型:bool
    • 元组:tuple
    • 集合:set
    • 字典:dict

输出

作用:程序输出内容给用户

print('hello Python')

age = 18
print(age)

# 需求:输出“今年我的年龄是18岁”

一. 格式化输出

所谓的格式化输出即按照一定的格式输出内容。

1.1 格式化符号

格式符号转换
%s字符串
%d有符号的十进制整数
%f浮点数
%c字符
%u无符号十进制整数
%o八进制整数
%x十六进制整数(小写ox)
%X十六进制整数(大写OX)
%e科学计数法(小写’e’)
%E科学计数法(大写’E’)
%g%f和%e的简写
%G%f和%E的简写

技巧

  • %06d,表示输出的整数显示位数,不足以0补全,超出当前位数则原样输出
  • %.2f,表示小数点后显示的小数位数。

1.2 体验

格式化字符串除了%s,还可以写为f'{表达式}'

age = 18 
name = 'TOM'
weight = 75.5
student_id = 1

# 我的名字是TOM
print('我的名字是%s' % name)

# 我的学号是0001
print('我的学号是%4d' % student_id)

# 我的体重是75.50公斤
print('我的体重是%.2f公斤' % weight)

# 我的名字是TOM,今年18岁了
print('我的名字是%s,今年%d岁了' % (name, age))

# 我的名字是TOM,明年19岁了
print('我的名字是%s,明年%d岁了' % (name, age + 1))

# 我的名字是TOM,明年19岁了
print(f'我的名字是{name}, 明年{age + 1}岁了')

f-格式化字符串是Python3.6中新增的格式化方法,该方法更简单易读。

1.3 转义字符

  • \n:换行。
  • \t:制表符,一个tab键(4个空格)的距离。

1.4 结束符

想一想,为什么两个print会换行输出?

print('输出的内容', end="\n")

在Python中,print(), 默认自带end="\n"这个换行结束符,所以导致每两个print直接会换行展示,用户可以按需求更改结束符。

总结

  • 格式化符号
    • %s:格式化输出字符串
    • %d:格式化输出整数
    • %f:格式化输出浮点数
  • f-字符串
    • f’{表达式}’
  • 转义字符
    • \n:换行
    • \t:制表符
  • print结束符
print('内容', end="")

输入

一. 输入

在Python中,程序接收用户输入的数据的功能即是输入。

image-20190116102035162

1.2 输入的语法

input("提示信息")

1.3 输入的特点

  • 当程序执行到input,等待用户输入,输入完成之后才继续向下执行。
  • 在Python中,input接收用户输入后,一般存储到变量,方便使用。
  • 在Python中,input会把接收到的任意用户输入的数据都当做字符串处理。
password = input('请输入您的密码:')

print(f'您输入的密码是{password}')
# <class 'str'>
print(type(password))

控制台输出结果如下:

image-20220222121253985

总结

  • 输入功能
    • input(‘提示文字’)
  • 输入的特点
    • 一般将input接收的数据存储到变量
    • input接收的任何数据默认都是字符串数据类型

数据类型转换

一. 转换数据类型的作用

问:input()接收用户输入的数据都是字符串类型,如果用户输入1,想得到整型该如何操作?

答:转换数据类型即可,即将字符串类型转换成整型。

二. 转换数据类型的函数

函数说明
int(x [,base ])将x转换为一个整数
float(x )将x转换为一个浮点数
complex(real [,imag ])创建一个复数,real为实部,imag为虚部
str(x )将对象 x 转换为字符串
repr(x )将对象 x 转换为表达式字符串
eval(str )用来计算在字符串中的有效Python表达式,并返回一个对象
tuple(s )将序列 s 转换为一个元组
list(s )将序列 s 转换为一个列表
chr(x )将一个整数转换为一个Unicode字符
ord(x )将一个字符转换为它的ASCII整数值
hex(x )将一个整数转换为一个十六进制字符串
oct(x )将一个整数转换为一个八进制字符串
bin(x )将一个整数转换为一个二进制字符串

三. 快速体验

需求:input接收用户输入,用户输入“1”,将这个数据1转换成整型。

# 1. 接收用户输入
num = input('请输入您的幸运数字:')

# 2. 打印结果
print(f"您的幸运数字是{num}")


# 3. 检测接收到的用户输入的数据类型 -- str类型
print(type(num))

# 4. 转换数据类型为整型 -- int类型
print(type(int(num)))

四. 实验

# 1. float() -- 转换成浮点型
num1 = 1
print(float(num1))
print(type(float(num1)))

# 2. str() -- 转换成字符串类型
num2 = 10
print(type(str(num2)))

# 3. tuple() -- 将一个序列转换成元组
list1 = [10, 20, 30]
print(tuple(list1))
print(type(tuple(list1)))


# 4. list() -- 将一个序列转换成列表
t1 = (100, 200, 300)
print(list(t1))
print(type(list(t1)))

# 5. eval() -- 将字符串中的数据转换成Python表达式原本类型
str1 = '10'
str2 = '[1, 2, 3]'
str3 = '(1000, 2000, 3000)'
print(type(eval(str1)))
print(type(eval(str2)))
print(type(eval(str3)))

总结

  • 转换数据类型常用的函数
    • int()
    • float()
    • str()
    • list()
    • tuple()
    • eval()

运算符

运算符的分类

  • 算数运算符
  • 赋值运算符
  • 复合赋值运算符
  • 比较运算符
  • 逻辑运算符

1. 算数运算符

运算符描述实例
+1 + 1 输出结果为 2
-1-1 输出结果为 0
*2 * 2 输出结果为 4
/10 / 2 输出结果为 5
//整除9 // 4 输出结果为2
%取余9 % 4 输出结果为 1
**指数2 ** 4 输出结果为 16,即 2 * 2 * 2 * 2
()小括号小括号用来提高运算优先级,即 (1 + 2) * 3 输出结果为 9

注意:

  • 混合运算优先级顺序:()高于 ** 高于 * / // % 高于 + -

2. 赋值运算符

运算符描述实例
=赋值=右侧的结果赋值给等号左侧的变量
  • 单个变量赋值
num = 1
print(num)
  • 多个变量赋值
num1, float1, str1 = 10, 0.5, 'hello world'
print(num1)
print(float1)
print(str1)

结果如下:

image-20220222142528911

  • 多变量赋相同值
a = b = 10
print(a)
print(b)

结果如下:

image-20220222142546938

3. 复合赋值运算符

运算符描述实例
+=加法赋值运算符c += a 等价于 c = c + a
-=减法赋值运算符c -= a 等价于 c = c- a
*=乘法赋值运算符c *= a 等价于 c = c * a
/=除法赋值运算符c /= a 等价于 c = c / a
//=整除赋值运算符c //= a 等价于 c = c // a
%=取余赋值运算符c %= a 等价于 c = c % a
**=幂赋值运算符c ** = a 等价于 c = c ** a
a = 100
a += 1
# 输出101  a = a + 1,最终a = 100 + 1
print(a)

b = 2
b *= 3
# 输出6  b = b * 3,最终b = 2 * 3
print(b)

c = 10
c += 1 + 2
# 输出13, 先算运算符右侧1 + 2 = 3, c += 3 , 推导出c = 10 + 3
print(c)

4. 比较运算符

比较运算符也叫关系运算符, 通常用来判断。

运算符描述实例
==判断相等。如果两个操作数的结果相等,则条件结果为真(True),否则条件结果为假(False)如a=3,b=3,则(a == b) 为 True
!=不等于 。如果两个操作数的结果不相等,则条件为真(True),否则条件结果为假(False)如a=3,b=3,则(a == b) 为 True如a=1,b=3,则(a != b) 为 True
>运算符左侧操作数结果是否大于右侧操作数结果,如果大于,则条件为真,否则为假如a=7,b=3,则(a > b) 为 True
<运算符左侧操作数结果是否小于右侧操作数结果,如果小于,则条件为真,否则为假如a=7,b=3,则(a < b) 为 False
>=运算符左侧操作数结果是否大于等于右侧操作数结果,如果大于,则条件为真,否则为假如a=7,b=3,则(a < b) 为 False如a=3,b=3,则(a >= b) 为 True
<=运算符左侧操作数结果是否小于等于右侧操作数结果,如果小于,则条件为真,否则为假如a=3,b=3,则(a <= b) 为 True
a = 7
b = 5
print(a == b)  # False
print(a != b)  # True
print(a < b)   # False
print(a > b)   # True
print(a <= b)  # False
print(a >= b)  # True

5. 逻辑运算符

运算符逻辑表达式描述实例
andx and y布尔"与":如果 x 为 False,x and y 返回 False,否则它返回 y 的值。True and False, 返回 False。
orx or y布尔"或":如果 x 是 True,它返回 True,否则它返回 y 的值。False or True, 返回 True。
notnot x布尔"非":如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。not True 返回 False, not False 返回 True
a = 1
b = 2
c = 3
print((a < b) and (b < c))  # True
print((a > b) and (b < c))  # False
print((a > b) or (b < c))   # True
print(not (a > b))          # True
5.1 拓展

数字之间的逻辑运算

a = 0
b = 1
c = 2

# and运算符,只要有一个值为0,则结果为0,否则结果为最后一个非0数字
print(a and b)  # 0
print(b and a)  # 0
print(a and c)  # 0
print(c and a)  # 0
print(b and c)  # 2
print(c and b)  # 1

# or运算符,只有所有值为0结果才为0,否则结果为第一个非0数字
print(a or b)  # 1
print(a or c)  # 2
print(b or c)  # 1

总结

  • 算数运算的优先级
    • 混合运算优先级顺序:()高于 ** 高于 * / // % 高于 + -
  • 赋值运算符
    • =
  • 复合赋值运算符
    • +=
    • -=
    • 优先级
      1. 先算复合赋值运算符右侧的表达式
      2. 再算复合赋值运算的算数运算
      3. 最后算赋值运算
  • 比较运算符
    • 判断相等: ==
    • 大于等于: >=
    • 小于等于:<=
    • 不等于: !=
  • 逻辑运算符
    • 与: and
    • 或:or
    • 非:not

条件语句

一. 了解条件语句

假设一个场景:

  • 同学们这个年龄去过网吧吗?
  • 去网吧进门想要上网必须做的一件事是做什么?(考虑重点)
  • 为什么要把身份证给工作人员?
  • 是不是就是为了判断是否成年?
  • 是不是如果成年可以上网?如果不成年则不允许上网?

其实这里所谓的判断就是条件语句,即条件成立执行某些代码,条件不成立则不执行这些代码

二. if 语法

2.1 语法

if 条件:
    条件成立执行的代码1
    条件成立执行的代码2
    ......

2.2 快速体验

if True:
    print('条件成立执行的代码1')
    print('条件成立执行的代码2')

# 下方的代码没有缩进到if语句块,所以和if条件无关
print('我是无论条件是否成立都要执行的代码')

执行结果如下:

image-20190103113457876

三. 实例:上网

需求分析:如果用户年龄大于等于18岁,即成年,输出"已经成年,可以上网"。

3.1 简单版

age = 20
if age >= 18:
    print('已经成年,可以上网')

print('系统关闭')

3.2 进阶版

新增需求:用户可以输出自己的年龄,然后系统进行判断是否成年,成年则输出"您的年龄是’用户输入的年龄’,已经成年,可以上网"。

# input接受用户输入的数据是字符串类型,条件是age和整型18做判断,所以这里要int转换数据类型
age = int(input('请输入您的年龄:'))

if age >= 18:
    print(f'您的年龄是{age},已经成年,可以上网')


print('系统关闭')

四. if…else…

作用:条件成立执行if下方的代码; 条件不成立执行else下方的代码。

思考:网吧上网的实例,如果成年,允许上网,如果不成年呢?是不是应该回复用户不能上网?

4.1 语法

if 条件:
    条件成立执行的代码1
    条件成立执行的代码2
    ......
else:
    条件不成立执行的代码1
    条件不成立执行的代码2
    ......

4.2 实用版:网吧上网

age = int(input('请输入您的年龄:'))

if age >= 18:
    print(f'您的年龄是{age},已经成年,可以上网')
else:
    print(f'您的年龄是{age},未成年,请自行回家写作业')

print('系统关闭')

注意:如果条件成立执行了某些代码,那么其他的情况的代码将不会执行。

五、多重判断

思考:中国合法工作年龄为18-60岁,即如果年龄小于18的情况为童工,不合法;如果年龄在18-60岁之间为合法工龄;大于60岁为法定退休年龄。

5.1 语法

if 条件1:
    条件1成立执行的代码1
    条件1成立执行的代码2
    ......
elif 条件2:
	条件2成立执行的代码1
    条件2成立执行的代码2
    ......
......
else:
    以上条件都不成立执行执行的代码

多重判断也可以和else配合使用。一般else放到整个if语句的最后,表示以上条件都不成立的时候执行的代码。

5.2 实例:工龄判断

age = int(input('请输入您的年龄:'))
if age < 18:
    print(f'您的年龄是{age},童工一枚')
elif (age >= 18) and (age <= 60):
    print(f'您的年龄是{age},合法工龄')
elif age > 60:
    print(f'您的年龄是{age},可以退休')

拓展:age >= 18 and age <= 60可以化简为18 <= age <= 60

六、if嵌套

思考:坐公交:如果有钱可以上车,没钱不能上车;上车后如果有空座,则可以坐下;如果没空座,就要站着。怎么书写程序?

6.1 语法

if 条件1:
	条件1成立执行的代码
    条件1成立执行的代码
    
    if 条件2:
    	条件2成立执行的代码
        条件2成立执行的代码
    

注意:条件2的if也是处于条件1成立执行的代码的缩进关系内部。

6.2 实例:坐公交

6.2.1 判断是否能上车
"""
1. 如果有钱,则可以上车
    2. 上车后,如果有空座,可以坐下
    上车后,如果没有空座,则站着等空座位
如果没钱,不能上车
"""
# 假设用 money = 1 表示有钱, money = 0表示没有钱
money = 1
if money == 1:
    print('土豪,不差钱,顺利上车')
else:
    print('没钱,不能上车,追着公交车跑')
6.2.2 判断是否能坐下
"""
1. 如果有钱,则可以上车
    2. 上车后,如果有空座,可以坐下
    上车后,如果没有空座,则站着等空座位
如果没钱,不能上车
"""
# 假设用 money = 1 表示有钱, money = 0表示没有钱; seat = 1 表示有空座,seat = 0 表示没有空座
money = 1
seat = 0
if money == 1:
    print('土豪,不差钱,顺利上车')
    if seat == 1:
        print('有空座,可以坐下')
    else:
        print('没有空座,站等')
else:
    print('没钱,不能上车,追着公交车跑')

七. 应用:猜拳游戏

需求分析:

  • 参与游戏的角色

    • 玩家
      • 手动出拳
    • 电脑
      • 随机出拳
  • 判断输赢

    • 玩家获胜
    玩家电脑
    石头剪刀
    剪刀
    石头
    • 平局
      • 玩家出拳 和 电脑出拳相同
    • 电脑获胜

随机做法:

1. 导出random模块
2. random.randint(开始,结束)
"""
提示:0-石头,1-剪刀,2-布
1. 出拳
玩家输入出拳
电脑随机出拳

2. 判断输赢
玩家获胜
平局
电脑获胜
"""

# 导入random模块
import random

# 计算电脑出拳的随机数字
computer = random.randint(0, 2)
print(computer)

player = int(input('请出拳:0-石头,1-剪刀,2-布:'))

# 玩家胜利 p0:c1 或 p1:c2 或 p2:c0
if (player == 0 and computer == 1) or (player == 1 and computer == 2) or (player == 2 and computer == 0):
    print('玩家获胜')

# 平局:玩家 == 电脑
elif player == computer:
    print('平局')
else:
    print('电脑获胜')

八. 三目运算符

三目运算符也叫三元运算符。

语法如下:

1 if 条件 else2

快速体验:

a = 1
b = 2

c = a if a > b else b
print(c)

总结

  • if语句语法
if 条件:
    条件成立执行的代码
  • if…else…
if 条件:
    条件成立执行的代码
else:
    条件不成立执行的代码
  • 多重判断
if 条件1:
    条件1成立执行的代码
elif 条件2:
    条件2成立执行的代码
else:
    以上条件都不成立执行的代码
  • if嵌套
if 条件1:
    条件1成立执行的代码
    if 条件2:
        条件2成立执行的代码
        ....

循环语句

一. 循环简介

1.1 循环的作用

思考:假如我有个女朋友,有一天我们闹矛盾生气了,女朋友说:道歉,说100遍“媳妇儿,我错了”。这个时候程序员会怎么做?

答:100遍print('媳妇儿,我错了')

思考:复制粘贴100次吗?

答:重复执行100次一样的代码,程序中循环即可

循环的作用:让代码更高效的重复执行。

1.2 循环的分类

在Python中,循环分为whilefor两种,最终实现效果相同。

二. while的语法

while 条件:
    条件成立重复执行的代码1
    条件成立重复执行的代码2
    ......

2.1 快速体验

需求:复现重复执行100次print('媳妇儿,我错了')(输出更简洁一些,我们这里设置5次)。

分析:初始值是0次,终点是5次,重复做的事情输出“媳妇儿, 我错了”。

# 循环的计数器
i = 0
while i < 5:
    print('媳妇儿,我错了')
    i += 1

print('任务结束')

三. while的应用

3.1 应用一:计算1-100累加和

分析:1-100的累加和,即1 + 2 + 3 + 4 +….,即前两个数字的相加结果 + 下一个数字( 前一个数字 + 1)。

i = 1
result = 0
while i <= 100:
    result += i
    i += 1

# 输出5050
print(result)

注意:为了验证程序的准确性,可以先改小数值,验证结果正确后,再改成1-100做累加。

3.2 应用二:计算1-100偶数累加和

分析:1-100的偶数和,即 2 + 4 + 6 + 8…,得到偶数的方法如下:

  • 偶数即是和2取余结果为0的数字,可以加入条件语句判断是否为偶数,为偶数则累加
  • 初始值为0 / 2 , 计数器每次累加2
3.2.1 方法一:条件判断和2取余数则累加
# 方法一:条件判断和2取余数为0则累加计算
i = 1
result = 0
while i <= 100:
    if i % 2 == 0:
        result += i
    i += 1

# 输出2550
print(result)
3.2.2 方法二:计数器控制
# 方法二:计数器控制增量为2
i = 0
result = 0
while i <= 100:
    result += i
    i += 2

# 输出2550
print(result)

四、break和continue

break和continue是循环中满足一定条件退出循环的两种不同方式。

4.1 理解

举例:一共吃5个苹果,吃完第一个,吃第二个…,这里"吃苹果"的动作是不是重复执行?

情况一:如果吃的过程中,吃完第三个吃饱了,则不需要再吃第4个和第五个苹果,即是吃苹果的动作停止,这里就是break控制循环流程,即终止此循环

情况二:如果吃的过程中,吃到第三个吃出一个大虫子…,是不是这个苹果就不吃了,开始吃第四个苹果,这里就是continue控制循环流程,即退出当前一次循环继而执行下一次循环代码

4.1.1 情况一:break
i = 1
while i <= 5:
    if i == 4:
        print(f'吃饱了不吃了')
        break
    print(f'吃了第{i}个苹果')
    i += 1

执行结果:

image-20190124114340900

4.1.2 情况二:continue
i = 1
while i <= 5:
    if i == 3:
        print(f'大虫子,第{i}个不吃了')
        # 在continue之前一定要修改计数器,否则会陷入死循环
        i += 1
        continue
    print(f'吃了第{i}个苹果')
    i += 1

执行结果:

image-20190124114514775

五. while循环嵌套

5.1 应用场景

故事梗概:有天女朋友又生气了,惩罚:说3遍“媳妇儿, 我错了”,这个程序是不是循环即可?但如果女朋友说:还要刷今天晚饭的碗,这个程序怎么书写?

while 条件:
    print('媳妇儿, 我错了')
print('刷晚饭的碗')

但如果女朋友还是生气,把这套惩罚要连续3天都执行,有如何书写程序?

while 条件:
    while 条件:
        print('媳妇儿, 我错了')
    print('刷晚饭的碗')

5.2 语法

while 条件1:
    条件1成立执行的代码
    ......
    while 条件2:
        条件2成立执行的代码
        ......

总结:所谓while循环嵌套,就是一个while里面嵌套一个while的写法,每个while和之前的基础语法是相同的。

5.3 快速体验:复现场景

5.3.1 代码
j = 0
while j < 3:
    i = 0
    while i < 3:
        print('媳妇儿,我错了')
        i += 1
    print('刷晚饭的碗')
    print('一套惩罚结束----------------')
    j += 1
5.3.2 执行结果

image-20190104161506542

5.3.3 理解执行流程

当内部循环执行完成之后,再执行下一次外部循环的条件判断。

六. while循环嵌套应用

6.1 应用一:打印星号(正方形)

6.1.1 需求
*****
*****
*****
*****
*****
6.1.2 代码

分析:一行输出5个星号,重复打印5行

# 重复打印5行星星
j = 0
while j <= 4:
    # 一行星星的打印
    i = 0
    while i <= 4:
        # 一行内的星星不能换行,取消print默认结束符\n
        print('*', end='')
        i += 1
    # 每行结束要换行,这里借助一个空的print,利用print默认结束符换行
    print()
    j += 1

6.2 应用二:打印星号(三角形)

6.2.1 需求
*
**
***
****
*****
6.2.2 代码

分析:一行输出星星的个数和行号是相等的,每行:重复打印行号数字个星号,将打印行星号的命令重复执行5次实现打印5行。

# 重复打印5行星星
# j表示行号
j = 0
while j <= 4:
    # 一行星星的打印
    i = 0
    # i表示每行里面星星的个数,这个数字要和行号相等所以i要和j联动
    while i <= j:
        print('*', end='')
        i += 1
    print()
    j += 1

6.3 九九乘法表

6.3.1 执行结果

image-20190104163553616

6.3.2 代码
# 重复打印9行表达式
j = 1
while j <= 9:
    # 打印一行里面的表达式 a * b = a*b
    i = 1
    while i <= j:
        print(f'{i}*{j}={j*i}', end='\t')
        i += 1
    print()
    j += 1

七、for循环

7.1 语法

for 临时变量 in 序列:
    重复执行的代码1
    重复执行的代码2
    ......

7.2 快速体验

str1 = 'itheima'
for i in str1:
    print(i)

执行结果:

image-20190104164152311

7.3 break

str1 = 'itheima'
for i in str1:
    if i == 'e':
        print('遇到e不打印')
        break
    print(i)

执行结果:

image-20190104165242555

7.4 continue

str1 = 'itheima'
for i in str1:
    if i == 'e':
        print('遇到e不打印')
        continue
    print(i)

执行结果:

image-20190104165413160

八. else

循环可以和else配合使用,else下方缩进的代码指的是当循环正常结束之后要执行的代码

8.1 while…else

需求:女朋友生气了,要惩罚:连续说5遍“媳妇儿,我错了”,如果道歉正常完毕女朋友就原谅我了,这个程序怎么写?

i = 1
while i <= 5:
    print('媳妇儿,我错了')
    i += 1
print('媳妇儿原谅我了...')

思考: 这个print是不是没有循环也能执行?

8.1.1 语法
while 条件:
    条件成立重复执行的代码
else:
    循环正常结束之后要执行的代码
8.1.2 示例
i = 1
while i <= 5:
    print('媳妇儿,我错了')
    i += 1
else:
    print('媳妇原谅我了,真开心,哈哈哈哈')

image-20190125111816497

8.1.3 退出循环的方式

需求:女朋友生气,要求道歉5遍:媳妇儿,我错了。道歉到第三遍的时候,媳妇埋怨这一遍说的不真诚,是不是就是要退出循环了?这个退出有两种可能性:

  • 更生气,不打算原谅,也不需要道歉了,程序如何书写?
  • 只一遍不真诚,可以忍受,继续下一遍道歉,程序如何书写?
  1. break
i = 1
while i <= 5:
    if i == 3:
        print('这遍说的不真诚')
        break
    print('媳妇儿,我错了')
    i += 1
else:
    print('媳妇原谅我了,真开心,哈哈哈哈')

image-20190125111952693

所谓else指的是循环正常结束之后要执行的代码,即如果是break终止循环的情况,else下方缩进的代码将不执行。

  1. continue
i = 1
while i <= 5:
    if i == 3:
        print('这遍说的不真诚')
        i += 1
        continue
    print('媳妇儿,我错了')
    i += 1
else:
    print('媳妇原谅我了,真开心,哈哈哈哈')

image-20190125112111170

因为continue是退出当前一次循环,继续下一次循环,所以该循环在continue控制下是可以正常结束的,当循环结束后,则执行了else缩进的代码。

8.2 for…else

8.2.1 语法
for 临时变量 in 序列:
    重复执行的代码
    ...
else:
    循环正常结束之后要执行的代码

所谓else指的是循环正常结束之后要执行的代码,即如果是break终止循环的情况,else下方缩进的代码将不执行。

8.2.2 示例
str1 = 'itheima'
for i in str1:
    print(i)
else:
    print('循环正常结束之后执行的代码')
8.2.3 退出循环的方式
  1. break终止循环
str1 = 'itheima'
for i in str1:
    if i == 'e':
        print('遇到e不打印')
        break
    print(i)
else:
    print('循环正常结束之后执行的代码')

执行结果:

image-20190104165551501

没有执行else缩进的代码。

  1. continue控制循环
str1 = 'itheima'
for i in str1:
    if i == 'e':
        print('遇到e不打印')
        continue
    print(i)
else:
    print('循环正常结束之后执行的代码')

执行结果:

image-20190104165714740

因为continue是退出当前一次循环,继续下一次循环,所以该循环在continue控制下是可以正常结束的,当循环结束后,则执行了else缩进的代码。

总结

  • 循环的作用:控制代码重复执行
  • while语法
while 条件:
    条件成立重复执行的代码1
    条件成立重复执行的代码2
    ......
  • while循环嵌套语法
while 条件1:
    条件1成立执行的代码
    ......
    while 条件2:
        条件2成立执行的代码
        ......
  • for循环语法
for 临时变量 in 序列:
    重复执行的代码1
    重复执行的代码2
    ......
  • break退出整个循环
  • continue退出本次循环,继续执行下一次重复执行的代码
  • else
    • while和for都可以配合else使用
    • else下方缩进的代码含义:当循环正常结束后执行的代码
    • break终止循环不会执行else下方缩进的代码
    • continue退出循环的方式执行else下方缩进的代

字符串

一. 认识字符串

字符串是 Python 中最常用的数据类型。我们一般使用引号来创建字符串。创建字符串很简单,只要为变量分配一个值即可。

a = 'hello world'
b = "abcdefg"
print(type(a))
print(type(b))

注意:控制台显示结果为<class 'str'>, 即数据类型为str(字符串)。

1.1 字符串特征

  • 一对引号字符串
name1 = 'Tom'
name2 = "Rose"
  • 三引号字符串
name3 = ''' Tom '''
name4 = """ Rose """
a = ''' i am Tom, 
        nice to meet you! '''

b = """ i am Rose, 
        nice to meet you! """

注意:三引号形式的字符串支持换行。

思考:如果创建一个字符串 I'm Tom?

c = "I'm Tom"
d = 'I\'m Tom'

1.2 字符串输出

print('hello world')

name = 'Tom'
print('我的名字是%s' % name)
print(f'我的名字是{name}')

1.3 字符串输入

在Python中,使用input()接收用户输入。

  • 代码
name = input('请输入您的名字:')
print(f'您输入的名字是{name}')
print(type(name))

password = input('请输入您的密码:')
print(f'您输入的密码是{password}')
print(type(password))
  • 输出结果

image-20190129172920882

二、下标

“下标”又叫“索引”,就是编号。比如火车座位号,座位号的作用:按照编号快速找到对应的座位。同理,下标的作用即是通过下标快速找到对应的数据。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dAVIJPc1-1680859371107)(null)]

2.1 快速体验

需求:字符串name = "abcdef",取到不同下标对应的数据。

  • 代码
name = "abcdef"

print(name[1])
print(name[0])
print(name[2])
  • 输出结果

image-20190129174231104

注意:下标从0开始。

image-20190129174231104

三、切片

切片是指对操作的对象截取其中一部分的操作。字符串、列表、元组都支持切片操作。

3.1 语法

序列[开始位置下标:结束位置下标:步长]

注意

1. 不包含结束位置下标对应的数据, 正负整数均可;
2. 步长是选取间隔,正负整数均可,默认步长为1。

3.2 体验

name = "abcdefg"

print(name[2:5:1])  # cde
print(name[2:5])  # cde
print(name[:5])  # abcde
print(name[1:])  # bcdefg
print(name[:])  # abcdefg
print(name[::2])  # aceg
print(name[:-1])  # abcdef, 负1表示倒数第一个数据
print(name[-4:-1])  # def
print(name[::-1])  # gfedcba

四、常用操作方法

字符串的常用操作方法有查找、修改和判断三大类。

4.1 查找

所谓字符串查找方法即是查找子串在字符串中的位置或出现的次数。

  • find():检测某个子串是否包含在这个字符串中,如果在返回这个子串开始的位置下标,否则则返回-1。
  1. 语法
字符串序列.find(子串, 开始位置下标, 结束位置下标)

注意:开始和结束位置下标可以省略,表示在整个字符串序列中查找。

  1. 快速体验
mystr = "hello world and itcast and itheima and Python"

print(mystr.find('and'))  # 12
print(mystr.find('and', 15, 30))  # 23
print(mystr.find('ands'))  # -1
  • index():检测某个子串是否包含在这个字符串中,如果在返回这个子串开始的位置下标,否则则报异常。
  1. 语法
字符串序列.index(子串, 开始位置下标, 结束位置下标)

注意:开始和结束位置下标可以省略,表示在整个字符串序列中查找。

  1. 快速体验
mystr = "hello world and itcast and itheima and Python"

print(mystr.index('and'))  # 12
print(mystr.index('and', 15, 30))  # 23
print(mystr.index('ands'))  # 报错
  • rfind(): 和find()功能相同,但查找方向为右侧开始。
  • rindex():和index()功能相同,但查找方向为右侧开始。
  • count():返回某个子串在字符串中出现的次数
  1. 语法
字符串序列.count(子串, 开始位置下标, 结束位置下标)

注意:开始和结束位置下标可以省略,表示在整个字符串序列中查找。

  1. 快速体验
mystr = "hello world and itcast and itheima and Python"

print(mystr.count('and'))  # 3
print(mystr.count('ands'))  # 0
print(mystr.count('and', 0, 20))  # 1

4.2 修改

所谓修改字符串,指的就是通过函数的形式修改字符串中的数据。

  • replace():替换
  1. 语法
字符串序列.replace(旧子串, 新子串, 替换次数)

注意:替换次数如果查出子串出现次数,则替换次数为该子串出现次数。

  1. 快速体验
mystr = "hello world and itcast and itheima and Python"

# 结果:hello world he itcast he itheima he Python
print(mystr.replace('and', 'he'))
# 结果:hello world he itcast he itheima he Python
print(mystr.replace('and', 'he', 10))
# 结果:hello world and itcast and itheima and Python
print(mystr)

注意:数据按照是否能直接修改分为可变类型不可变类型两种。字符串类型的数据修改的时候不能改变原有字符串,属于不能直接修改数据的类型即是不可变类型。

  • split():按照指定字符分割字符串。
  1. 语法
字符串序列.split(分割字符, num)

注意:num表示的是分割字符出现的次数,即将来返回数据个数为num+1个。

  1. 快速体验
mystr = "hello world and itcast and itheima and Python"

# 结果:['hello world ', ' itcast ', ' itheima ', ' Python']
print(mystr.split('and'))
# 结果:['hello world ', ' itcast ', ' itheima and Python']
print(mystr.split('and', 2))
# 结果:['hello', 'world', 'and', 'itcast', 'and', 'itheima', 'and', 'Python']
print(mystr.split(' '))
# 结果:['hello', 'world', 'and itcast and itheima and Python']
print(mystr.split(' ', 2))

注意:如果分割字符是原有字符串中的子串,分割后则丢失该子串。

  • join():用一个字符或子串合并字符串,即是将多个字符串合并为一个新的字符串。
  1. 语法
字符或子串.join(多字符串组成的序列)
  1. 快速体验
list1 = ['chuan', 'zhi', 'bo', 'ke']
t1 = ('aa', 'b', 'cc', 'ddd')
# 结果:chuan_zhi_bo_ke
print('_'.join(list1))
# 结果:aa...b...cc...ddd
print('...'.join(t1))
  • capitalize():将字符串第一个字符转换成大写。
mystr = "hello world and itcast and itheima and Python"

# 结果:Hello world and itcast and itheima and python
print(mystr.capitalize())

注意:capitalize()函数转换后,只字符串第一个字符大写,其他的字符全都小写。

  • title():将字符串每个单词首字母转换成大写。
mystr = "hello world and itcast and itheima and Python"

# 结果:Hello World And Itcast And Itheima And Python
print(mystr.title())
  • lower():将字符串中大写转小写。
mystr = "hello world and itcast and itheima and Python"

# 结果:hello world and itcast and itheima and python
print(mystr.lower())
  • upper():将字符串中小写转大写。
mystr = "hello world and itcast and itheima and Python"

# 结果:HELLO WORLD AND ITCAST AND ITHEIMA AND PYTHON
print(mystr.upper())
  • lstrip():删除字符串左侧空白字符。

image-20190129213453010

  • rstrip():删除字符串右侧空白字符。

image-20190129213558850

  • strip():删除字符串两侧空白字符。

image-20190129213637584

  • ljust():返回一个原字符串左对齐,并使用指定字符(默认空格)填充至对应长度 的新字符串。
  1. 语法
字符串序列.ljust(长度, 填充字符)
  1. 输出效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0RWZ5zPY-1680859355471)(https://gitee.com/Kawhildh/blog-image/raw/master/python/image-20190130141125560.png)]

  • rjust():返回一个原字符串右对齐,并使用指定字符(默认空格)填充至对应长度 的新字符串,语法和ljust()相同。
  • center():返回一个原字符串居中对齐,并使用指定字符(默认空格)填充至对应长度 的新字符串,语法和ljust()相同。

image-20190130141442074

4.3 判断

所谓判断即是判断真假,返回的结果是布尔型数据类型:True 或 False。

  • startswith():检查字符串是否是以指定子串开头,是则返回 True,否则返回 False。如果设置开始和结束位置下标,则在指定范围内检查。
  1. 语法
字符串序列.startswith(子串, 开始位置下标, 结束位置下标)
  1. 快速体验
mystr = "hello world and itcast and itheima and Python   "

# 结果:True
print(mystr.startswith('hello'))

# 结果False
print(mystr.startswith('hello', 5, 20))
  • endswith()::检查字符串是否是以指定子串结尾,是则返回 True,否则返回 False。如果设置开始和结束位置下标,则在指定范围内检查。
  1. 语法
字符串序列.endswith(子串, 开始位置下标, 结束位置下标)
  1. 快速体验
mystr = "hello world and itcast and itheima and Python"

# 结果:True
print(mystr.endswith('Python'))

# 结果:False
print(mystr.endswith('python'))

# 结果:False
print(mystr.endswith('Python', 2, 20))
  • isalpha():如果字符串至少有一个字符并且所有字符都是字母则返回 True, 否则返回 False。
mystr1 = 'hello'
mystr2 = 'hello12345'

# 结果:True
print(mystr1.isalpha())

# 结果:False
print(mystr2.isalpha())
  • isdigit():如果字符串只包含数字则返回 True 否则返回 False。
mystr1 = 'aaa12345'
mystr2 = '12345'

# 结果: False
print(mystr1.isdigit())

# 结果:False
print(mystr2.isdigit())
  • isalnum():如果字符串至少有一个字符并且所有字符都是字母或数字则返 回 True,否则返回 False。
mystr1 = 'aaa12345'
mystr2 = '12345-'

# 结果:True
print(mystr1.isalnum())

# 结果:False
print(mystr2.isalnum())
  • isspace():如果字符串中只包含空白,则返回 True,否则返回 False。
mystr1 = '1 2 3 4 5'
mystr2 = '     '

# 结果:False
print(mystr1.isspace())

# 结果:True
print(mystr2.isspace())

五. 总结

  • 下标
    • 计算机为数据序列中每个元素分配的从0开始的编号
  • 切片
序列名[开始位置下标:结束位置下标:步长]
  • 常用操作方法
    • find()
    • index()

列表

一. 列表的应用场景

思考:有一个人的姓名(TOM)怎么书写存储程序?

答:变量。

思考:如果一个班级100位学生,每个人的姓名都要存储,应该如何书写程序?声明100个变量吗?

答:列表即可, 列表一次性可以存储多个数据。

二. 列表的格式

[数据1, 数据2, 数据3, 数据4......]

列表可以一次性存储多个数据,且可以为不同数据类型。

三. 列表的常用操作

列表的作用是一次性存储多个数据,程序员可以对这些数据进行的操作有:增、删、改、查。

3.1 查找

3.1.1 下标
name_list = ['Tom', 'Lily', 'Rose']

print(name_list[0])  # Tom
print(name_list[1])  # Lily
print(name_list[2])  # Rose
3.1.2 函数
  • index():返回指定数据所在位置的下标 。
  1. 语法
列表序列.index(数据, 开始位置下标, 结束位置下标)
  1. 快速体验
name_list = ['Tom', 'Lily', 'Rose']

print(name_list.index('Lily', 0, 2))  # 1

注意:如果查找的数据不存在则报错。

  • count():统计指定数据在当前列表中出现的次数。
name_list = ['Tom', 'Lily', 'Rose']

print(name_list.count('Lily'))  # 1
  • len():访问列表长度,即列表中数据的个数。
name_list = ['Tom', 'Lily', 'Rose']

print(len(name_list))  # 3
3.1.3 判断是否存在
  • in:判断指定数据在某个列表序列,如果在返回True,否则返回False
name_list = ['Tom', 'Lily', 'Rose']

# 结果:True
print('Lily' in name_list)

# 结果:False
print('Lilys' in name_list)
  • not in:判断指定数据不在某个列表序列,如果不在返回True,否则返回False
name_list = ['Tom', 'Lily', 'Rose']

# 结果:False
print('Lily' not in name_list)

# 结果:True
print('Lilys' not in name_list)
  • 体验案例

需求:查找用户输入的名字是否已经存在。

name_list = ['Tom', 'Lily', 'Rose']

name = input('请输入您要搜索的名字:')

if name in name_list:
    print(f'您输入的名字是{name}, 名字已经存在')
else:
    print(f'您输入的名字是{name}, 名字不存在')

3.2 增加

作用:增加指定数据到列表中。

  • append():列表结尾追加数据。
  1. 语法
列表序列.append(数据)
  1. 体验
name_list = ['Tom', 'Lily', 'Rose']

name_list.append('xiaoming')

# 结果:['Tom', 'Lily', 'Rose', 'xiaoming']
print(name_list)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VLF5dXaU-1680859393585)(null)]

列表追加数据的时候,直接在原列表里面追加了指定数据,即修改了原列表,故列表为可变类型数据。

  1. 注意点

如果append()追加的数据是一个序列,则追加整个序列到列表

name_list = ['Tom', 'Lily', 'Rose']

name_list.append(['xiaoming', 'xiaohong'])

# 结果:['Tom', 'Lily', 'Rose', ['xiaoming', 'xiaohong']]
print(name_list)
  • extend():列表结尾追加数据,如果数据是一个序列,则将这个序列的数据逐一添加到列表。
  1. 语法
列表序列.extend(数据)
  1. 快速体验

    2.1 单个数据

name_list = ['Tom', 'Lily', 'Rose']

name_list.extend('xiaoming')

# 结果:['Tom', 'Lily', 'Rose', 'x', 'i', 'a', 'o', 'm', 'i', 'n', 'g']
print(name_list)

​ 2.2 序列数据

name_list = ['Tom', 'Lily', 'Rose']

name_list.extend(['xiaoming', 'xiaohong'])

# 结果:['Tom', 'Lily', 'Rose', 'xiaoming', 'xiaohong']
print(name_list)
  • insert():指定位置新增数据。
  1. 语法
列表序列.insert(位置下标, 数据)
  1. 快速体验
name_list = ['Tom', 'Lily', 'Rose']

name_list.insert(1, 'xiaoming')

# 结果:['Tom', 'xiaoming', 'Lily', 'Rose']
print(name_list)

3.3 删除

  • del
  1. 语法
del 目标
  1. 快速体验

    2.1 删除列表

name_list = ['Tom', 'Lily', 'Rose']

# 结果:报错提示:name 'name_list' is not defined
del name_list
print(name_list)

​ 2.2 删除指定数据

name_list = ['Tom', 'Lily', 'Rose']

del name_list[0]

# 结果:['Lily', 'Rose']
print(name_list)
  • pop():删除指定下标的数据(默认为最后一个),并返回该数据。
  1. 语法
列表序列.pop(下标)
  1. 快速体验
name_list = ['Tom', 'Lily', 'Rose']

del_name = name_list.pop(1)

# 结果:Lily
print(del_name)

# 结果:['Tom', 'Rose']
print(name_list)
  • remove():移除列表中某个数据的第一个匹配项。
  1. 语法
列表序列.remove(数据)
  1. 快速体验
name_list = ['Tom', 'Lily', 'Rose']

name_list.remove('Rose')

# 结果:['Tom', 'Lily']
print(name_list)
  • clear():清空列表
name_list = ['Tom', 'Lily', 'Rose']

name_list.clear()
print(name_list) # 结果: []

3.4 修改

  • 修改指定下标数据
name_list = ['Tom', 'Lily', 'Rose']

name_list[0] = 'aaa'

# 结果:['aaa', 'Lily', 'Rose']
print(name_list)
  • 逆置:reverse()
num_list = [1, 5, 2, 3, 6, 8]

num_list.reverse()

# 结果:[8, 6, 3, 2, 5, 1]
print(num_list)
  • 排序:sort()
  1. 语法
列表序列.sort( key=None, reverse=False)

注意:reverse表示排序规则,reverse = True 降序, reverse = False 升序(默认)

  1. 快速体验
num_list = [1, 5, 2, 3, 6, 8]

num_list.sort()

# 结果:[1, 2, 3, 5, 6, 8]
print(num_list)

3.5 复制

函数:copy()

name_list = ['Tom', 'Lily', 'Rose']

name_li2 = name_list.copy()

# 结果:['Tom', 'Lily', 'Rose']
print(name_li2)

四. 列表的循环遍历

需求:依次打印列表中的各个数据。

4.1 while

  • 代码
name_list = ['Tom', 'Lily', 'Rose']

i = 0
while i < len(name_list):
    print(name_list[i])
    i += 1
  • 执行结果

image-20190130164205143

4.2 for

  • 代码
name_list = ['Tom', 'Lily', 'Rose']

for i in name_list:
    print(i)
  • 执行结果

image-20190130164227739

五. 列表嵌套

所谓列表嵌套指的就是一个列表里面包含了其他的子列表。

应用场景:要存储班级一、二、三三个班级学生姓名,且每个班级的学生姓名在一个列表。

name_list = [['小明', '小红', '小绿'], ['Tom', 'Lily', 'Rose'], ['张三', '李四', '王五']]

思考: 如何查找到数据"李四"?

# 第一步:按下标查找到李四所在的列表
print(name_list[2])

# 第二步:从李四所在的列表里面,再按下标找到数据李四
print(name_list[2][1])

六. 综合应用 – 随机分配办公室

需求:有三个办公室,8位老师,8位老师随机分配到3个办公室

七. 总结

  • 列表的格式
[数据1, 数据2, 数据3]
  • 常用操作方法
    • index()
    • len()
    • append()
    • pop()
    • remove()
  • 列表嵌套
name_list = [['小明', '小红', '小绿'], ['Tom', 'Lily', 'Rose'], ['张三', '李四', '王五']]
name_list[2][1]

元组

一. 元组的应用场景

思考:如果想要存储多个数据,但是这些数据是不能修改的数据,怎么做?

答:列表?列表可以一次性存储多个数据,但是列表中的数据允许更改。

num_list = [10, 20, 30]
num_list[0] = 100

一个元组可以存储多个数据,元组内的数据是不能修改的。

二. 定义元组

元组特点:定义元组使用小括号,且逗号隔开各个数据,数据可以是不同的数据类型。

# 多个数据元组
t1 = (10, 20, 30)

# 单个数据元组
t2 = (10,)

注意:如果定义的元组只有一个数据,那么这个数据后面也好添加逗号,否则数据类型为唯一的这个数据的数据类型

t2 = (10,)
print(type(t2))  # tuple

t3 = (20)
print(type(t3))  # int

t4 = ('hello')
print(type(t4))  # str

三. 元组的常见操作

元组数据不支持修改,只支持查找,具体如下:

  • 按下标查找数据
tuple1 = ('aa', 'bb', 'cc', 'bb')
print(tuple1[0])  # aa
  • index():查找某个数据,如果数据存在返回对应的下标,否则报错,语法和列表、字符串的index方法相同。
tuple1 = ('aa', 'bb', 'cc', 'bb')
print(tuple1.index('aa'))  # 0
  • count():统计某个数据在当前元组出现的次数。
tuple1 = ('aa', 'bb', 'cc', 'bb')
print(tuple1.count('bb'))  # 2
  • len():统计元组中数据的个数。
tuple1 = ('aa', 'bb', 'cc', 'bb')
print(len(tuple1))  # 4

注意:元组内的直接数据如果修改则立即报错

tuple1 = ('aa', 'bb', 'cc', 'bb')
tuple1[0] = 'aaa'

但是如果元组里面有列表,修改列表里面的数据则是支持的,故自觉很重要。

tuple2 = (10, 20, ['aa', 'bb', 'cc'], 50, 30)
print(tuple2[2])  # 访问到列表

# 结果:(10, 20, ['aaaaa', 'bb', 'cc'], 50, 30)
tuple2[2][0] = 'aaaaa'
print(tuple2)

四. 总结

  • 定义元组
t1 = (10, 20, 30)

t2 = (10,)
  • 常用操作方法
    • index()
    • len()

字典

一. 字典的应用场景

思考1: 如果有多个数据,例如:‘Tom’, ‘男’, 20,如何快速存储?

答:列表

list1 = ['Tom', '男', 20]

思考2:如何查找到数据’Tom’?

答:查找到下标为0的数据即可。

list1[0]

思考3:如果将来数据顺序发生变化,如下所示,还能用list1[0]访问到数据’Tom’吗?。

list1 = ['男', 20, 'Tom']

答:不能,数据’Tom’此时下标为2。

思考4:数据顺序发生变化,每个数据的下标也会随之变化,如何保证数据顺序变化前后能使用同一的标准查找数据呢?

答:字典,字典里面的数据是以键值对形式出现,字典数据和数据顺序没有关系,即字典不支持下标,后期无论数据如何变化,只需要按照对应的键的名字查找数据即可。

二. 创建字典的语法

字典特点:

  • 符号为大括号
  • 数据为键值对形式出现
  • 各个键值对之间用逗号隔开
# 有数据字典
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}

# 空字典
dict2 = {}

dict3 = dict()

注意:一般称冒号前面的为键(key),简称k;冒号后面的为值(value),简称v。

三. 字典常见操作

3.1 增

写法:字典序列[key] = 值

注意:如果key存在则修改这个key对应的值;如果key不存在则新增此键值对。

dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}

dict1['name'] = 'Rose'
# 结果:{'name': 'Rose', 'age': 20, 'gender': '男'}
print(dict1)

dict1['id'] = 110

# {'name': 'Rose', 'age': 20, 'gender': '男', 'id': 110}
print(dict1)

注意:字典为可变类型。

3.2 删

  • del() / del:删除字典或删除字典中指定键值对。
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}

del dict1['gender']
# 结果:{'name': 'Tom', 'age': 20}
print(dict1)
  • clear():清空字典
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}

dict1.clear()
print(dict1)  # {}

3.3 改

写法:字典序列[key] = 值

注意:如果key存在则修改这个key对应的值 ;如果key不存在则新增此键值对。

3.4 查

3.4.1 key值查找
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
print(dict1['name'])  # Tom
print(dict1['id'])  # 报错

如果当前查找的key存在,则返回对应的值;否则则报错。

3.4.2 get()
  • 语法
字典序列.get(key, 默认值)

注意:如果当前查找的key不存在则返回第二个参数(默认值),如果省略第二个参数,则返回None。

  • 快速体验
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
print(dict1.get('name'))  # Tom
print(dict1.get('id', 110))  # 110
print(dict1.get('id'))  # None
3.4.3 keys()
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
print(dict1.keys())  # dict_keys(['name', 'age', 'gender'])
3.4.4 values()
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
print(dict1.values())  # dict_values(['Tom', 20, '男'])
3.4.5 items()
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
print(dict1.items())  # dict_items([('name', 'Tom'), ('age', 20), ('gender', '男')])

四. 字典的循环遍历

4.1 遍历字典的key

dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
for key in dict1.keys():
    print(key)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jZpxNbRs-1680859355474)(https://gitee.com/Kawhildh/blog-image/raw/master/python/image-20190212103905553.png)]

4.2 遍历字典的value

dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
for value in dict1.values():
    print(value)

image-20190212103957777

4.3 遍历字典的元素

dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
for item in dict1.items():
    print(item)

image-20190212104046564

4.4 遍历字典的键值对

dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
for key, value in dict1.items():
    print(f'{key} = {value}')

image-20190212104223143

五. 总结

  • 定义字典
dict1 = {'name': 'Python', 'age': 30}

dict2 = {}

dict3 = dict()
  • 常见操作
    • 增/改
字典序列[key] =
  • 查找
    • 字典序列[key]
    • keys()
    • values()
    • items()

集合

一. 创建集合

创建集合使用{}set(), 但是如果要创建空集合只能使用set(),因为{}用来创建空字典。

s1 = {10, 20, 30, 40, 50}
print(s1)

s2 = {10, 30, 20, 10, 30, 40, 30, 50}
print(s2)

s3 = set('abcdefg')
print(s3)

s4 = set()
print(type(s4))  # set

s5 = {}
print(type(s5))  # dict

image-20190318104620690

特点:

  1. 集合可以去掉重复数据;
  2. 集合数据是无序的,故不支持下标

二. 集合常见操作方法

2.1 增加数据

  • add()
s1 = {10, 20}
s1.add(100)
s1.add(10)
print(s1)  # {100, 10, 20}

因为集合有去重功能,所以,当向集合内追加的数据是当前集合已有数据的话,则不进行任何操作。

  • update(), 追加的数据是序列。
s1 = {10, 20}
# s1.update(100)  # 报错
s1.update([100, 200])
s1.update('abc')
print(s1)

image-20190318121424514

2.2 删除数据

  • remove(),删除集合中的指定数据,如果数据不存在则报错。
s1 = {10, 20}

s1.remove(10)
print(s1)

s1.remove(10)  # 报错
print(s1)
  • discard(),删除集合中的指定数据,如果数据不存在也不会报错。
s1 = {10, 20}

s1.discard(10)
print(s1)

s1.discard(10)
print(s1)
  • pop(),随机删除集合中的某个数据,并返回这个数据。
s1 = {10, 20, 30, 40, 50}

del_num = s1.pop()
print(del_num)
print(s1)

2.3 查找数据

  • in:判断数据在集合序列
  • not in:判断数据不在集合序列
s1 = {10, 20, 30, 40, 50}

print(10 in s1)
print(10 not in s1)

三. 总结

  • 创建集合

    • 有数据集合
    s1 = {数据1, 数据2, ...}
    
    • 无数据集合
    s1 = set()
    
  • 常见操作

    • 增加数据
      • add()
      • update()
    • 删除数据
      • remove()
      • discard()

公共操作

一. 运算符

运算符描述支持的容器类型
+合并字符串、列表、元组
*复制字符串、列表、元组
in元素是否存在字符串、列表、元组、字典
not in元素是否不存在字符串、列表、元组、字典

1.1 +

# 1. 字符串 
str1 = 'aa'
str2 = 'bb'
str3 = str1 + str2
print(str3)  # aabb


# 2. 列表 
list1 = [1, 2]
list2 = [10, 20]
list3 = list1 + list2
print(list3)  # [1, 2, 10, 20]

# 3. 元组 
t1 = (1, 2)
t2 = (10, 20)
t3 = t1 + t2
print(t3)  # (10, 20, 100, 200)

1.2 *

# 1. 字符串
print('-' * 10)  # ----------

# 2. 列表
list1 = ['hello']
print(list1 * 4)  # ['hello', 'hello', 'hello', 'hello']

# 3. 元组
t1 = ('world',)
print(t1 * 4)  # ('world', 'world', 'world', 'world')

1.3 in或not in

# 1. 字符串
print('a' in 'abcd')  # True
print('a' not in 'abcd')  # False

# 2. 列表
list1 = ['a', 'b', 'c', 'd']
print('a' in list1)  # True
print('a' not in list1)  # False

# 3. 元组
t1 = ('a', 'b', 'c', 'd')
print('aa' in t1)  # False
print('aa' not in t1)  # True

二. 公共方法

函数描述
len()计算容器中元素个数
del 或 del()删除
max()返回容器中元素最大值
min()返回容器中元素最小值
range(start, end, step)生成从start到end的数字,步长为 step,供for循环使用
enumerate()函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

2.1 len()

# 1. 字符串
str1 = 'abcdefg'
print(len(str1))  # 7

# 2. 列表
list1 = [10, 20, 30, 40]
print(len(list1))  # 4

# 3. 元组
t1 = (10, 20, 30, 40, 50)
print(len(t1))  # 5

# 4. 集合
s1 = {10, 20, 30}
print(len(s1))  # 3

# 5. 字典
dict1 = {'name': 'Rose', 'age': 18}
print(len(dict1))  # 2

2.2 del()

# 1. 字符串
str1 = 'abcdefg'
del str1
print(str1)

# 2. 列表
list1 = [10, 20, 30, 40]
del(list1[0])
print(list1)  # [20, 30, 40]

2.3 max()

# 1. 字符串
str1 = 'abcdefg'
print(max(str1))  # g

# 2. 列表
list1 = [10, 20, 30, 40]
print(max(list1))  # 40

2.4 min()

# 1. 字符串
str1 = 'abcdefg'
print(min(str1))  # a

# 2. 列表
list1 = [10, 20, 30, 40]
print(min(list1))  # 10

2.5 range()

# 1 2 3 4 5 6 7 8 9
for i in range(1, 10, 1):
    print(i)

# 1 3 5 7 9
for i in range(1, 10, 2):
    print(i)

# 0 1 2 3 4 5 6 7 8 9
for i in range(10):
    print(i)

注意:range()生成的序列不包含end数字。

2.6 enumerate()

  • 语法
enumerate(可遍历对象, start=0)

注意:start参数用来设置遍历数据的下标的起始值,默认为0。

  • 快速体验
list1 = ['a', 'b', 'c', 'd', 'e']

for i in enumerate(list1):
    print(i)

for index, char in enumerate(list1, start=1):
    print(f'下标是{index}, 对应的字符是{char}')

image-20190213115919040

三. 容器类型转换

3.1 tuple()

作用:将某个序列转换成元组

list1 = [10, 20, 30, 40, 50, 20]
s1 = {100, 200, 300, 400, 500}

print(tuple(list1))
print(tuple(s1))

3.2 list()

作用:将某个序列转换成列表

t1 = ('a', 'b', 'c', 'd', 'e')
s1 = {100, 200, 300, 400, 500}

print(list(t1))
print(list(s1))

3.3 set()

作用:将某个序列转换成集合

list1 = [10, 20, 30, 40, 50, 20]
t1 = ('a', 'b', 'c', 'd', 'e')

print(set(list1))
print(set(t1))

注意:

1. 集合可以快速完成列表去重
2. 集合不支持下标

四. 总结

  • 运算符
    • in / not in
  • 公共方法
    • len()
    • del()
    • range()
    • enumerate()
  • 数据类型转换
    • tuple()
    • list()
    • set()

推导式

一. 列表推导式

作用:用一个表达式创建一个有规律的列表或控制一个有规律列表。

列表推导式又叫列表生成式。

1.1 快速体验

需求:创建一个0-10的列表。

  • while循环实现
# 1. 准备一个空列表
list1 = []

# 2. 书写循环,依次追加数字到空列表list1中
i = 0
while i < 10:
    list1.append(i)
    i += 1

print(list1)
  • for循环实现
list1 = []
for i in range(10):
    list1.append(i)

print(list1)
  • 列表推导式实现
list1 = [i for i in range(10)]
print(list1)

1.2 带if的列表推导式

需求:创建0-10的偶数列表

  • 方法一:range()步长实现
list1 = [i for i in range(0, 10, 2)]
print(list1)
  • 方法二:if实现
list1 = [i for i in range(10) if i % 2 == 0]
print(list1)

1.3 多个for循环实现列表推导式

需求:创建列表如下:

[(1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
  • 代码如下:
list1 = [(i, j) for i in range(1, 3) for j in range(3)]
print(list1)

二. 字典推导式

思考:如果有如下两个列表:

list1 = ['name', 'age', 'gender']
list2 = ['Tom', 20, 'man']

如何快速合并为一个字典?

答:字典推导式

字典推导式作用:快速合并列表为字典或提取字典中目标数据。

2.1 快速体验

  1. 创建一个字典:字典key是1-5数字,value是这个数字的2次方。
dict1 = {i: i**2 for i in range(1, 5)}
print(dict1)  # {1: 1, 2: 4, 3: 9, 4: 16}
  1. 将两个列表合并为一个字典
list1 = ['name', 'age', 'gender']
list2 = ['Tom', 20, 'man']

dict1 = {list1[i]: list2[i] for i in range(len(list1))}
print(dict1)
  1. 提取字典中目标数据
counts = {'MBP': 268, 'HP': 125, 'DELL': 201, 'Lenovo': 199, 'acer': 99}

# 需求:提取上述电脑数量大于等于200的字典数据
count1 = {key: value for key, value in counts.items() if value >= 200}
print(count1)  # {'MBP': 268, 'DELL': 201}

三. 集合推导式

需求:创建一个集合,数据为下方列表的2次方。

list1 = [1, 1, 2]

代码如下:

list1 = [1, 1, 2]
set1 = {i ** 2 for i in list1}
print(set1)  # {1, 4}

注意:集合有数据去重功能。

四. 总结

  • 推导式的作用:简化代码
  • 推导式写法
# 列表推导式
[xx for xx in range()]

# 字典推导式
{xx1: xx2 for ... in ...}

# 集合推导式
{xx for xx in ...}

函数

函数一

一. 函数的作用

需求:用户到ATM机取钱:

  1. 输入密码后显示"选择功能"界面
  2. 查询余额后显示"选择功能"界面
  3. 取2000钱后显示"选择功能"界面

特点:显示“选择功能”界面需要重复输出给用户,怎么实现?

image-20181231211912413

函数就是将一段具有独立功能的代码块 整合到一个整体并命名,在需要的位置调用这个名称即可完成对应的需求。

函数在开发过程中,可以更高效的实现代码重用

二. 函数的使用步骤

2.1 定义函数
def 函数名(参数):
    代码1
    代码2
    ......
2.2 调用函数
函数名(参数)

注意:

1. 不同的需求,参数可有可无。
2. 在Python中,函数必须==先定义后使用==。
2.3 快速体验

需求:复现ATM取钱功能。

  1. 搭建整体框架(复现需求)
print('密码正确登录成功')

# 显示"选择功能"界面

print('查询余额完毕')

# 显示"选择功能"界面

print('取了2000元钱')

# 显示"选择功能"界面
  1. 确定“选择功能”界面内容
print('查询余额')
print('存款')
print('取款')
  1. 封装"选择功能"

注意:一定是先定义函数,后调用函数。

# 封装ATM机功能选项 -- 定义函数
def select_func():
    print('-----请选择功能-----')
    print('查询余额')
    print('存款')
    print('取款')
    print('-----请选择功能-----')
  1. 调用函数

在需要显示“选择功能”函数的位置调用函数。

print('密码正确登录成功')
# 显示"选择功能"界面 -- 调用函数
select_func()

print('查询余额完毕')
# 显示"选择功能"界面 -- 调用函数
select_func()

print('取了2000元钱')
# 显示"选择功能"界面 -- 调用函数
select_func()

三.函数的参数作用

思考:完成需求如下:一个函数完成两个数1和2的加法运算,如何书写程序?

# 定义函数
def add_num1():
    result = 1 + 2
    print(result)


# 调用函数
add_num1()

思考:上述add_num1函数只能完成数字1和2的加法运算,如果想要这个函数变得更灵活,可以计算任何用户指定的两个数字的和,如何书写程序?

分析:用户要在调用函数的时候指定具体数字,那么在定义函数的时候就需要接收用户指定的数字。函数调用时候指定的数字和定义函数时候接收的数字即是函数的参数。

# 定义函数时同时定义了接收用户数据的参数a和b,a和b是形参
def add_num2(a, b):
    result = a + b
    print(result)


# 调用函数时传入了真实的数据10 和 20,真实数据为实参
add_num2(10, 20)

四.函数的返回值作用

例如:我们去超市购物,比如买烟,给钱之后,是不是售货员会返回给我们烟这个商品,在函数中,如果需要返回结果给用户需要使用函数返回值。

def buy():
    return '烟'

# 使用变量保存函数返回值
goods = buy()
print(goods)
4.1 应用

需求:制作一个计算器,计算任意两数字之和,并保存结果。

def sum_num(a, b):
    return a + b


# 用result变量保存函数返回值
result = sum_num(1, 2)
print(result)

五.函数的说明文档

思考:定义一个函数后,程序员如何书写程序能够快速提示这个函数的作用?

答:注释

思考:如果代码多,我们是不是需要在很多代码中找到这个函数定义的位置才能看到注释?如果想更方便的查看函数的作用怎么办?

答:函数的说明文档

函数的说明文档也叫函数的文档说明。

5.1 语法
  • 定义函数的说明文档
def 函数名(参数):
    """ 说明文档的位置 """
    代码
    ......
  • 查看函数的说明文档
help(函数名)
5.2 快速体验
def sum_num(a, b):
    """ 求和函数 """
    return a + b


help(sum_num)

image-20190219112749727

六.函数嵌套调用

所谓函数嵌套调用指的是一个函数里面又调用了另外一个函数

  • 示例
def testB():
    print('---- testB start----')
    print('这里是testB函数执行的代码...(省略)...')
    print('---- testB end----')

def testA():
    print('---- testA start----')
    testB()
    print('---- testA end----')

testA()
  • 效果

image-20190219113648783

  • 执行流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oesWPyHo-1680859355479)(https://gitee.com/Kawhildh/blog-image/raw/master/python/1.png)]

  • 如果函数A中,调用了另外一个函数B,那么先把函数B中的任务都执行完毕之后才会回到上次 函数A执行的位置。

七. 函数应用

7.1 打印图形
  1. 打印一条横线
def print_line():
    print('-' * 20)


print_line()

image-20190219155107988

  1. 打印多条横线
def print_line():
    print('-' * 20)


def print_lines(num):
    i = 0
    while i < num:
        print_line()
        i += 1


print_lines(5)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OcZlyDgj-1680859355479)(https://gitee.com/Kawhildh/blog-image/raw/master/python/image-20190219155040124.png)]

7.2 函数计算
  1. 求三个数之和
def sum_num(a, b, c):
    return a + b + c


result = sum_num(1, 2, 3)
print(result)  # 6
  1. 求三个数平均值
def average_num(a, b, c):
    sumResult = sum_num(a, b, c)
    return sumResult / 3

result = average_num(1, 2, 3)
print(result)  # 2.0

八. 总结

  • 函数的作用:封装代码,高效的代码重用

  • 函数使用步骤

    • 定义函数
    def 函数名():
        代码1
        代码2
        ...
    
    • 调用函数
    函数名()
    
  • 函数的参数:函数调用的时候可以传入真实数据,增大函数的使用的灵活性

    • 形参:函数定义时书写的参数(非真实数据)
    • 实参:函数调用时书写的参数(真实数据)
  • 函数的返回值

    • 作用:函数调用后,返回需要的计算结果
    • 写法
    return 表达式
    
  • 函数的说明文档

    • 作用:保存函数解释说明的信息
    • 写法
    def 函数名():
        """ 函数说明文档 """
    
  • 函数嵌套调用:一个函数内部嵌套调用另外一个函数

函数二

一. 变量作用域

变量作用域指的是变量生效的范围,主要分为两类:局部变量全局变量

  • 局部变量

所谓局部变量是定义在函数体内部的变量,即只在函数体内部生效。

def testA():
    a = 100

    print(a)


testA()  # 100
print(a)  # 报错:name 'a' is not defined

变量a是定义在testA函数内部的变量,在函数外部访问则立即报错。

局部变量的作用:在函数体内部,临时保存数据,即当函数调用完成后,则销毁局部变量。

  • 全局变量

所谓全局变量,指的是在函数体内、外都能生效的变量。

思考:如果有一个数据,在函数A和函数B中都要使用,该怎么办?

答:将这个数据存储在一个全局变量里面。

# 定义全局变量a
a = 100


def testA():
    print(a)  # 访问全局变量a,并打印变量a存储的数据


def testB():
    print(a)  # 访问全局变量a,并打印变量a存储的数据


testA()  # 100
testB()  # 100

思考:testB函数需求修改变量a的值为200,如何修改程序?

a = 100


def testA():
    print(a)


def testB():
    a = 200
    print(a)


testA()  # 100
testB()  # 200
print(f'全局变量a = {a}')  # 全局变量a = 100

思考:在testB函数内部的a = 200中的变量a是在修改全局变量a吗?

答:不是。观察上述代码发现,15行得到a的数据是100,仍然是定义全局变量a时候的值,而没有返回

testB函数内部的200。综上:testB函数内部的a = 200是定义了一个局部变量。

思考:如何在函数体内部修改全局变量?

a = 100


def testA():
    print(a)


def testB():
    # global 关键字声明a是全局变量
    global a
    a = 200
    print(a)


testA()  # 100
testB()  # 200
print(f'全局变量a = {a}')  # 全局变量a = 200

二. 多函数程序执行流程

一般在实际开发过程中,一个程序往往由多个函数(后面知识中会讲解类)组成,并且多个函数共享某些数据,如下所示:

  • 共用全局变量
# 1. 定义全局变量
glo_num = 0


def test1():
    global glo_num
    # 修改全局变量
    glo_num = 100


def test2():
    # 调用test1函数中修改后的全局变量
    print(glo_num)
    

# 2. 调用test1函数,执行函数内部代码:声明和修改全局变量
test1()
# 3. 调用test2函数,执行函数内部代码:打印
test2()  # 100
  • 返回值作为参数传递
def test1():
    return 50


def test2(num):
    print(num)


# 1. 保存函数test1的返回值
result = test1()


# 2.将函数返回值所在变量作为参数传递到test2函数
test2(result)  # 50

三. 函数的返回值

思考:如果一个函数如些两个return (如下所示),程序如何执行?

def return_num():
    return 1
    return 2


result = return_num()
print(result)  # 1

答:只执行了第一个return,原因是因为return可以退出当前函数,导致return下方的代码不执行。

思考:如果一个函数要有多个返回值,该如何书写代码?

def return_num():
    return 1, 2


result = return_num()
print(result)  # (1, 2)

注意:

  1. return a, b写法,返回多个数据的时候,默认是元组类型。
  2. return后面可以连接列表、元组或字典,以返回多个值。

四. 函数的参数

4.1 位置参数

位置参数:调用函数时根据函数定义的参数位置来传递参数。

def user_info(name, age, gender):
    print(f'您的名字是{name}, 年龄是{age}, 性别是{gender}')


user_info('TOM', 20, '男')

注意:传递和定义参数的顺序及个数必须一致。

4.2 关键字参数

函数调用,通过“键=值”形式加以指定。可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求。

def user_info(name, age, gender):
    print(f'您的名字是{name}, 年龄是{age}, 性别是{gender}')


user_info('Rose', age=20, gender='女')
user_info('小明', gender='男', age=16)

注意:函数调用时,如果有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序。

4.3 缺省参数

缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)。

def user_info(name, age, gender='男'):
    print(f'您的名字是{name}, 年龄是{age}, 性别是{gender}')


user_info('TOM', 20)
user_info('Rose', 18, '女')

注意:函数调用时,如果为缺省参数传值则修改默认参数值;否则使用这个默认值。

4.4 不定长参数

**不定长参数也叫可变参数。**用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。此时,可用包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递,会显得非常方便。

  • 包裹位置传递
def user_info(*args):
    print(args)


# ('TOM',) 
user_info('TOM')
# ('TOM', 18)
user_info('TOM', 18)

注意:传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组(tuple),args是元组类型,这就是包裹位置传递。

  • 包裹关键字传递
def user_info(**kwargs):
    print(kwargs)


# {'name': 'TOM', 'age': 18, 'id': 110}
user_info(name='TOM', age=18, id=110)

综上:无论是包裹位置传递还是包裹关键字传递,都是一个组包的过程。

五. 拆包和交换变量值

5.1 拆包
  • 拆包:元组
def return_num():
    return 100, 200


num1, num2 = return_num()
print(num1)  # 100
print(num2)  # 200
  • 拆包:字典
dict1 = {'name': 'TOM', 'age': 18}
a, b = dict1

# 对字典进行拆包,取出来的是字典的key
print(a)  # name
print(b)  # age

print(dict1[a])  # TOM
print(dict1[b])  # 18
5.2 交换变量值

需求:有变量a = 10b = 20,交换两个变量的值。

  • 方法一

借助第三变量存储数据。

# 1. 定义中间变量
c = 0

# 2. 将a的数据存储到c
c = a

# 3. 将b的数据20赋值到a,此时a = 20
a = b

# 4. 将之前c的数据10赋值到b,此时b = 10
b = c

print(a)  # 20
print(b)  # 10
  • 方法二
a, b = 1, 2
a, b = b, a
print(a)  # 2
print(b)  # 1

六. 引用

6.1 了解引用

在python中,值是靠引用来传递来的。

我们可以用id()来判断两个变量是否为同一个值的引用。 我们可以将id值理解为那块内存的地址标识。

# 1. int类型
a = 1
b = a

print(b)  # 1

print(id(a))  # 140708464157520
print(id(b))  # 140708464157520

a = 2
print(b)  # 1,说明int类型为不可变类型 

print(id(a))  # 140708464157552,此时得到是的数据2的内存地址
print(id(b))  # 140708464157520


# 2. 列表
aa = [10, 20]
bb = aa

print(id(aa))  # 2325297783432
print(id(bb))  # 2325297783432


aa.append(30)
print(bb)  # [10, 20, 30], 列表为可变类型

print(id(aa))  # 2325297783432
print(id(bb))  # 2325297783432
6.2 引用当做实参

代码如下:

def test1(a):
    print(a)
    print(id(a))

    a += a

    print(a)
    print(id(a))


# int:计算前后id值不同
b = 100
test1(b)

# 列表:计算前后id值相同
c = [11, 22]
test1(c)

效果图如下:

image-20190220111744493

七. 可变和不可变类型

所谓可变类型与不可变类型是指:数据能够直接进行修改,如果能直接修改那么就是可变,否则是不可变.

  • 可变类型
    • 列表
    • 字典
    • 集合
  • 不可变类型
    • 整型
    • 浮点型
    • 字符串
    • 元组

八. 总结

  • 变量作用域
    • 全局:函数体内外都能生效
    • 局部:当前函数体内部生效
  • 函数多返回值写法
return 表达式1, 表达式2...
  • 函数的参数
    • 位置参数
      • 形参和实参的个数和书写顺序必须一致
    • 关键字参数
      • 写法: key=value
      • 特点:形参和实参的书写顺序可以不一致;关键字参数必须书写在位置参数的后面
    • 缺省参数
      • 缺省参数就是默认参数
      • 写法:key=vlaue
    • 不定长位置参数
      • 收集所有位置参数,返回一个元组
    • 不定长关键字参数
      • 收集所有关键字参数,返回一个字典
  • 引用:Python中,数据的传递都是通过引用

学生管理系统

一. 应用:学员管理系统

1.1 系统简介

需求:进入系统显示系统功能界面,功能如下:

  • 1、添加学员
  • 2、删除学员
  • 3、修改学员信息
  • 4、查询学员信息
  • 5、显示所有学员信息
  • 6、退出系统

系统共6个功能,用户根据自己需求选取。

1.2 步骤分析

  1. 显示功能界面

  2. 用户输入功能序号

  3. 根据用户输入的功能序号,执行不同的功能(函数)

    3.1 定义函数

    3.2 调用函数

1.3 需求实现

1.3.1 显示功能界面

定义函数print_info,负责显示系统功能。

def print_info():
    print('-' * 20)
    print('欢迎登录学员管理系统')
    print('1: 添加学员')
    print('2: 删除学员')
    print('3: 修改学员信息')
    print('4: 查询学员信息')
    print('5: 显示所有学员信息')
    print('6: 退出系统')
    print('-' * 20)
    
    
print_info()
1.3.2 用户输入序号,选择功能
user_num = input('请选择您需要的功能序号:')
1.3.3 根据用户选择,执行不同的功能
if user_num == '1':
    print('添加学员')
elif user_num == '2':
    print('删除学员')
elif user_num == '3':
    print('修改学员信息')
elif user_num == '4':
    print('查询学员信息')
elif user_num == '5':
    print('显示所有学员信息')
elif user_num == '6':
    print('退出系统')

工作中,需要根据实际需求调优代码。

  1. 用户选择系统功能的代码需要循环使用,直到用户主动退出系统。
  2. 如果用户输入1-6以外的数字,需要提示用户。
while True:
    # 1. 显示功能界面
    print_info()
    
    # 2. 用户选择功能
    user_num = input('请选择您需要的功能序号:')

    # 3. 根据用户选择,执行不同的功能
    if user_num == '1':
        print('添加学员')
    elif user_num == '2':
        print('删除学员')
    elif user_num == '3':
        print('修改学员信息')
    elif user_num == '4':
        print('查询学员信息')
    elif user_num == '5':
        print('显示所有学员信息')
    elif user_num == '6':
        print('退出系统')
    else:
        print('输入错误,请重新输入!!!')
1.3.4 定义不同功能的函数

所有功能函数都是操作学员信息,所有存储所有学员信息应该是一个全局变量,数据类型为列表

info = []
1.3.4.1 添加学员
  • 需求分析
  1. 接收用户输入学员信息,并保存

  2. 判断是否添加学员信息

    2.1 如果学员姓名已经存在,则报错提示

    2.2 如果学员姓名不存在,则准备空字典,将用户输入的数据追加到字典,再列表追加字典数据

  3. 对应的if条件成立的位置调用该函数

  • 代码实现
def add_info():
    """ 添加学员 """
    # 接收用户输入学员信息
    new_id = input('请输入学号:')
    new_name = input('请输入姓名:')
    new_tel = input('请输入手机号:')
    

    # 声明info是全局变量
    global info

    # 检测用户输入的姓名是否存在,存在则报错提示
    for i in info:
        if new_name == i['name']:
            print('该用户已经存在!')
            return

    # 如果用户输入的姓名不存在,则添加该学员信息
    info_dict = {}
    
    # 将用户输入的数据追加到字典
    info_dict['id'] = new_id
    info_dict['name'] = new_name
    info_dict['tel'] = new_tel
    
    # 将这个学员的字典数据追加到列表
    info.append(info_dict)
    
    print(info)
1.3.4.2 删除学员
  • 需求分析

按用户输入的学员姓名进行删除

  1. 用户输入目标学员姓名

  2. 检查这个学员是否存在

    2.1 如果存在,则列表删除这个数据

    2.2 如果不存在,则提示“该用户不存在”

  3. 对应的if条件成立的位置调用该函数

  • 代码实现
# 删除学员
def del_info():
    """删除学员"""
    # 1. 用户输入要删除的学员的姓名
    del_name = input('请输入要删除的学员的姓名:')

    global info
    # 2. 判断学员是否存在:如果输入的姓名存在则删除,否则报错提示
    for i in info:
        if del_name == i['name']:
            info.remove(i)
            break
    else:
        print('该学员不存在')

    print(info)
1.3.4.3 修改学员信息
  • 需求分析
  1. 用户输入目标学员姓名

  2. 检查这个学员是否存在

    2.1 如果存在,则修改这位学员的信息,例如手机号

    2.2 如果不存在,则报错

  3. 对应的if条件成立的位置调用该函数

  • 代码实现
# 修改函数
def modify_info():
    """修改函数"""
    # 1. 用户输入要修改的学员的姓名
    modify_name = input('请输入要修改的学员的姓名:')

    global info
    # 2. 判断学员是否存在:如果输入的姓名存在则修改手机号,否则报错提示
    for i in info:
        if modify_name == i ['name']:
            i['tel'] = input('请输入新的手机号:')
            break
    else:
        print('该学员不存在')
    
    print(info)
1.3.4.4 查询学员信息
  • 需求分析
  1. 用户输入目标学员姓名

  2. 检查学员是否存在

    2.1 如果存在,则显示这个学员的信息

    2.2 如果不存在,则报错提示

  3. 对应的if条件成立的位置调用该函数

  • 代码实现
# 查询学员
def search_info():
    """查询学员"""
    # 1. 输入要查找的学员姓名:
    search_name = input('请输入要查找的学员姓名:')

    global info
    # 2. 判断学员是否存在:如果输入的姓名存在则显示这位学员信息,否则报错提示
    for i in info:
        if search_name == i['name']:
            print('查找到的学员信息如下:----------')
            print(f"该学员的学号是{i['id']}, 姓名是{i['name']}, 手机号是{i['tel']}")
            break
    else:
        print('该学员不存在')
1.3.4.5 显示所有学员信息
  • 需求分析

打印所有学员信息

  • 代码实现
# 显示所有学员信息
def print_all():
    """ 显示所有学员信息 """
    print('学号\t姓名\t手机号')
    for i in info:
        print(f'{i["id"]}\t{i["name"]}\t{i["tel"]}')
1.3.4.6 退出系统

在用户输入功能序号6的时候要退出系统,代码如下:

    ......
    elif user_num == '6':
        exit_flag = input('确定要退出吗?yes or no')
        if exit_flag == 'yes':
            break

二. 递归

2.1 递归的应用场景

递归是一种编程思想,应用场景:

  1. 在我们日常开发中,如果要遍历一个文件夹下面所有的文件,通常会使用递归来实现;
  2. 在后续的算法课程中,很多算法都离不开递归,例如:快速排序。
2.1.1 递归的特点
  • 函数内部自己调用自己
  • 必须有出口

2.2 应用:3以内数字累加和

  • 代码
# 3 + 2 + 1
def sum_numbers(num):
    # 1.如果是1,直接返回1 -- 出口
    if num == 1:
        return 1
    # 2.如果不是1,重复执行累加并返回结果
    return num + sum_numbers(num-1)


sum_result = sum_numbers(3)
# 输出结果为6
print(sum_result)
  • 执行结果

image-20181229145115121

三. lambda 表达式

3.1 lambda的应用场景

如果一个函数有一个返回值,并且只有一句代码,可以使用 lambda简化。

3.2 lambda语法

lambda 参数列表 : 表达式

注意

  • lambda表达式的参数可有可无,函数的参数在lambda表达式中完全适用。
  • lambda表达式能接收任何数量的参数但只能返回一个表达式的值。
快速入门
# 函数
def fn1():
    return 200


print(fn1)
print(fn1())


# lambda表达式
fn2 = lambda: 100
print(fn2)
print(fn2())

注意:直接打印lambda表达式,输出的是此lambda的内存地址

3.3 示例:计算a + b

3.3.1 函数实现
def add(a, b):
    return a + b


result = add(1, 2)
print(result)

思考:需求简单,是否代码多?

3.3.2 lambda实现
fn1 = lambda a, b: a + b
print(fn1(1, 2))

3.4 lambda的参数形式

3.4.1.无参数
fn1 = lambda: 100
print(fn1())
3.4.2.一个参数
fn1 = lambda a: a
print(fn1('hello world'))
3.4.3.默认参数
fn1 = lambda a, b, c=100: a + b + c
print(fn1(10, 20))
3.4.4.可变参数:*args
fn1 = lambda *args: args
print(fn1(10, 20, 30))

注意:这里的可变参数传入到lambda之后,返回值为元组。

3.4.5.可变参数:**kwargs
fn1 = lambda **kwargs: kwargs
print(fn1(name='python', age=20))

3.5 lambda的应用

3.5.1. 带判断的lambda
fn1 = lambda a, b: a if a > b else b
print(fn1(1000, 500))
3.5.2. 列表数据按字典key的值排序
students = [
    {'name': 'TOM', 'age': 20},
    {'name': 'ROSE', 'age': 19},
    {'name': 'Jack', 'age': 22}
]

# 按name值升序排列
students.sort(key=lambda x: x['name'])
print(students)

# 按name值降序排列
students.sort(key=lambda x: x['name'], reverse=True)
print(students)

# 按age值升序排列
students.sort(key=lambda x: x['age'])
print(students)

四. 高阶函数

把函数作为参数传入,这样的函数称为高阶函数,高阶函数是函数式编程的体现。函数式编程就是指这种高度抽象的编程范式。

4.1 体验高阶函数

在Python中,abs()函数可以完成对数字求绝对值计算。

abs(-10)  # 10

round()函数可以完成对数字的四舍五入计算。

round(1.2)  # 1
round(1.9)  # 2

需求:任意两个数字,按照指定要求整理数字后再进行求和计算。

  • 方法1
def add_num(a, b):
    return abs(a) + abs(b)


result = add_num(-1, 2)
print(result)  # 3
  • 方法2
def sum_num(a, b, f):
    return f(a) + f(b)


result = sum_num(-1, 2, abs)
print(result)  # 3

注意:两种方法对比之后,发现,方法2的代码会更加简洁,函数灵活性更高。

函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度较快。

4.2 内置高阶函数

4.2.1 map()

map(func, lst),将传入的函数变量func作用到lst变量的每个元素中,并将结果组成新的列表(Python2)/迭代器(Python3)返回。

需求:计算list1序列中各个数字的2次方。

list1 = [1, 2, 3, 4, 5]


def func(x):
    return x ** 2


result = map(func, list1)

print(result)  # <map object at 0x0000013769653198>
print(list(result))  # [1, 4, 9, 16, 25]
4.2.2 reduce()

reduce(func,lst),其中func必须有两个参数。每次func计算的结果继续和序列的下一个元素做累积计算。

注意:reduce()传入的参数func必须接收2个参数。

需求:计算list1序列中各个数字的累加和。

import functools

list1 = [1, 2, 3, 4, 5]


def func(a, b):
    return a + b


result = functools.reduce(func, list1)

print(result)  # 15
4.2.3 filter()

filter(func, lst)函数用于过滤序列, 过滤掉不符合条件的元素, 返回一个 filter 对象。如果要转换为列表, 可以使用 list() 来转换。

list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


def func(x):
    return x % 2 == 0


result = filter(func, list1)

print(result)  # <filter object at 0x0000017AF9DC3198>
print(list(result))  # [2, 4, 6, 8, 10]

五. 总结

  • 递归

    • 函数内部自己调用自己
    • 必须有出口
  • lambda

    • 语法
    lambda 参数列表: 表达式
    
    • lambda的参数形式

      • 无参数
      lambda: 表达式
      
      • 一个参数
      lambda 参数: 表达式
      
      • 默认参数
      lambda key=value: 表达式
      
      • 不定长位置参数
      lambda *args: 表达式
      
      • 不定长关键字参数
      lambda **kwargs: 表达式
      
  • 高阶函数

    • 作用:把函数作为参数传入,化简代码
    • 内置高阶函数
      • map()
      • reduce()
      • filter()

文件操作

一. 文件操作的作用

思考:什么是文件?

思考:文件操作包含什么?

答:打开、关闭、读、写、复制…

思考:文件操作的的作用是什么?

答:读取内容、写入内容、备份内容…

总结:文件操作的作用就是把一些内容(数据)存储存放起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力

二. 文件的基本操作

2.1 文件操作步骤

  1. 打开文件
  2. 读写等操作
  3. 关闭文件

注意:可以只打开和关闭文件,不进行任何读写操作。

2.1.1 打开

在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件,语法如下:

open(name, mode)

name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。

mode:设置打开文件的模式(访问模式):只读、写入、追加等。

2.1.1.1 打开文件模式
模式描述
r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
r+打开一个文件用于读写。文件指针将会放在文件的开头。
rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
w+打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
2.1.1.2 快速体验
f = open('test.txt', 'w')

注意:此时的fopen函数的文件对象。

2.1.2 文件对象方法
2.1.2.1 写
  • 语法
对象对象.write('内容')
  • 体验
# 1. 打开文件
f = open('test.txt', 'w')

# 2.文件写入
f.write('hello world')

# 3. 关闭文件
f.close()

注意:

  1. w a模式:如果文件不存在则创建该文件;如果文件存在,w模式先清空再写入,a模式直接末尾追加。
  2. r模式:如果文件不存在则报错。
2.1.2.2 读
  • read()
文件对象.read(num)

num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据。

  • readlines()

readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。

f = open('test.txt')
content = f.readlines()

# ['hello world\n', 'abcdefg\n', 'aaa\n', 'bbb\n', 'ccc']
print(content)

# 关闭文件
f.close()
  • readline()

readline()一次读取一行内容。

f = open('test.txt')

content = f.readline()
print(f'第一行:{content}')

content = f.readline()
print(f'第二行:{content}')

# 关闭文件
f.close()

image-20190222105332438

2.1.2.3 seek()

作用:用来移动文件指针。

语法如下:

文件对象.seek(偏移量, 起始位置)

起始位置:

  • 0:文件开头
  • 1:当前位置
  • 2:文件结尾
2.1.3 关闭
文件对象.close()

三. 文件备份

需求:用户输入当前目录下任意文件名,程序完成对该文件的备份功能(备份文件名为xx[备份]后缀,例如:test[备份].txt)。

3.1 步骤

  1. 接收用户输入的文件名
  2. 规划备份文件名
  3. 备份文件写入数据

3.2 代码实现

  1. 接收用户输入目标文件名
old_name = input('请输入您要备份的文件名:')
  1. 规划备份文件名

    2.1 提取目标文件后缀

    2.2 组织备份的文件名,xx[备份]后缀

# 2.1 提取文件后缀点的下标
index = old_name.rfind('.')

# print(index)  # 后缀中.的下标

# print(old_name[:index])  # 源文件名(无后缀)

# 2.2 组织新文件名 旧文件名 + [备份] + 后缀
new_name = old_name[:index] + '[备份]' + old_name[index:]

# 打印新文件名(带后缀)
# print(new_name)
  1. 备份文件写入数据

    3.1 打开源文件 和 备份文件

    3.2 将源文件数据写入备份文件

    3.3 关闭文件

# 3.1 打开文件
old_f = open(old_name, 'rb')
new_f = open(new_name, 'wb')

# 3.2 将源文件数据写入备份文件
while True:
    con = old_f.read(1024)
    if len(con) == 0:
        break
    new_f.write(con)

# 3.3 关闭文件
old_f.close()
new_f.close()

3.3 思考

如果用户输入.txt,这是一个无效文件,程序如何更改才能限制只有有效的文件名才能备份?

答:添加条件判断即可。

old_name = input('请输入您要备份的文件名:')

index = old_name.rfind('.')


if index > 0:
    postfix = old_name[index:]

new_name = old_name[:index] + '[备份]' + postfix

old_f = open(old_name, 'rb')
new_f = open(new_name, 'wb')

while True:
    con = old_f.read(1024)
    if len(con) == 0:
        break
    new_f.write(con)

old_f.close()
new_f.close()

四. 文件和文件夹的操作

在Python中文件和文件夹的操作要借助os模块里面的相关功能,具体步骤如下:

  1. 导入os模块
import os
  1. 使用os模块相关功能
os.函数名()

4.1 文件重命名

os.rename(目标文件名, 新文件名)

4.2 删除文件

os.remove(目标文件名)

4.3 创建文件夹

os.mkdir(文件夹名字)

4.4 删除文件夹

os.rmdir(文件夹名字)

4.5 获取当前目录

os.getcwd()

4.6 改变默认目录

os.chdir(目录)

4.7 获取目录列表

os.listdir(目录)

五.应用案例

需求:批量修改文件名,既可添加指定字符串,又能删除指定字符串。

  • 步骤
  1. 设置添加删除字符串的的标识
  2. 获取指定目录的所有文件
  3. 将原有文件名添加/删除指定字符串,构造新名字
  4. os.rename()重命名
  • 代码
import os

# 设置重命名标识:如果为1则添加指定字符,flag取值为2则删除指定字符
flag = 1

# 获取指定目录
dir_name = './'

# 获取指定目录的文件列表
file_list = os.listdir(dir_name)
# print(file_list)


# 遍历文件列表内的文件
for name in file_list:

    # 添加指定字符
    if flag == 1:
        new_name = 'Python-' + name
    # 删除指定字符
    elif flag == 2:
        num = len('Python-')
        new_name = name[num:]

    # 打印新文件名,测试程序正确性
    print(new_name)
    
    # 重命名
    os.rename(dir_name+name, dir_name+new_name)

六. 总结

  • 文件操作步骤

    • 打开
    文件对象 = open(目标文件, 访问模式)
    
    • 操作

      文件对象.read()
      文件对象.readlines()
      文件对象.readline()
      
      文件对象.write()
      
      • seek()
    • 关闭

    文件对象.close()
    
  • 主访问模式

    • w:写,文件不存在则新建该文件
    • r:读,文件不存在则报错
    • a:追加
  • 文件和文件夹操作

    • 重命名:os.rename()
    • 获取当前目录:os.getcwd()
    • 获取目录列表:os.listdir()

模块

简介

如果你从 Python 解释器退出再进入,那么你定义的所有的方法和变量就都消失了。

为此 Python 提供了一个办法,把这些定义存放在文件中,为一些脚本或者交互式的解释器实例使用,这个文件被称为模块。

模块是一个包含所有你定义的类、函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。这也是使用 python 标准库的方法。

image-20220316164240630

模块的功能

  1. 提高代码重用率----需要用到某些函数,直接调用某个模块即可,无需重复编写
  2. 提高程序层次性----不同功能模块放入不同的模块,逻辑性和层次性提高
  3. 方便协作防止冲突----函数和变量在不同模块下可以有同样命名,但是不会冲突,这样多人协作时,即便命名冲突,也不会干扰

模块导入的流程

  1. 搜索----当解释器遇到import语句时,如果模块在当前的搜索路径就会被导入。

    搜索路径是一个解释器会先进行搜索的所有目录的列表。

  2. 编译----编译成.pyc文件,增加执行速度

  3. 运行----将模块定义的函数和类等导入运行

说明:一般导入一次之后,再import相同模块则不会再搜索、编译、运行,需要通过reload来实现重新导入

模块导入语法

import

image-20220316170920618

基本语法

`import module1[, module2[,... moduleN]`

当解释器遇到 import 语句,如果模块在当前的搜索路径就会被导入。

搜索路径是一个解释器会先进行搜索的所有目录的列表。如想要导入模块 support,需要把命令放在脚本的顶端:

导入整个模块到内存,不覆盖本地命名空间

调用模块中的函数时采用点号调用 Module.func1 Module.func2 Module.func3

from Module import Func

Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中,语法如下:

from modname import name1[, name2[, ... nameN]]

导入模块中某个函数到内存

导入时会覆盖本地某个命名(若本地有)

from Module import *

把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:

from modname import *

此操作会覆盖本地所有命名

reload Module

基本语法

import importlib
importlib.reload(module)

from importlib import reload
reload(module)

Python只会导入同一模块一次,若再次通过import或者from命令调用同一模块,也不会再次加载,而直接从内存寻找,通过reload关键词可以重新载入该模块(另外一种方式便是重启Python)若脚本文件有变动,则需要通过reload重新载入

面向对象

什么是对象?

Python是一种“面向对象编程”的语言,所以Python语言中,一切皆对象!

Python语言中,所有能够被处理的、被解决的“东西”,都称之为对象(Object)

本质上讲,对象是一组数据以及能处理这些数据的函数----列表、字典、数字、字符串、函数都是对象

对象有各自特性和行为,例如猴子(能上树),树懒(爱睡觉)……

image-20220317214551164

对象的组成

对象的特性

对象是什么?

----对象的数据、对象的状态,是一种静态信息。

  • 值value:对象表示的数据项
  • 身份id:唯一性身份标志,是该对象的内存地址,可用内建函数id()获得
  • 类型tpye:对象的类型决定了该对象可以保存什么类型的值,可进行什么样的操作,以及遵循什么样的规则,可以type()获得

对象的行为

对象能做什么?

----对象的操作、功能、方法等,是一种动态信息。

我们将能对象能做的,统称为 “方法/属性/操作”

  • 方法method

  • 函数function

  • 操作operation

对象举例

image-20220317214924495

类—对象----特征、行为

编程方法

image-20220317215058844

1.

围绕“do"解决、处理、流程为依据来进行编程,称为“面向过程编程”

POP(procedure-oriented programming)

2.

围绕“things"东西、事情、数据为依据来进行编程,称为“面向对象编程”

OOP(object-oriented programming)

什么是类?

image-20220317215510829

  • 类(Class)是设计蓝图(或模型),用来创建不同类型的对象,Python内置有数字、字符串、列表、字典等对象,这些内置对象有已经规定好的属性和方法,若需要创建新的对象类型,则需要使用类
  • 类是一种数据结构,可以用来定义对象,将数据值和行为特征融合在一起
  • 类指定了对象将包含哪些数据和函数,数据一般是变量即对应值,函数一般我们称之为方法

功能

  • 对事务进行高度抽象----类是对事务的抽象
  • 提高代码重用率----通过子类和超类,实现类的(多重)继承
  • 提高程序层次性----类支持继承

语法

image-20220317215725459

class ClassName : ----定义类的名称 class ClassName(object) :

‘class documentation string’ ----类文档字符串

class_suite ----类体(内容) {数据属性,方法属性}

类的实例

image-20220317215949668

定义

类(Class)是现实世界的抽象的实体以编程形式出现,实例(Instance)则是这些对象的具体化,通过实例化,类的方法/函数才可以调用,这是类的绑定特征

语法

xxxx = className()

创建实例

类的属性

类的属性由数据和方法两个部分组成,可以通过点号方式来访问

数据属性存储数据和变量值,方法属性存储操作数据的函数

调用语法

xxxx.value 调用类的数据属性(变量值)

xxxx.method 调用类的方法属性(函数)

类的专有方法

  • init : 构造函数,在生成对象时调用
  • del : 析构函数,释放对象时使用
  • repr : 打印,转换
  • setitem : 按照索引赋值
  • getitem: 按照索引获取值
  • len: 获得长度
  • cmp: 比较运算
  • call: 函数调用
  • add: 加运算
  • sub: 减运算
  • mul: 乘运算
  • truediv: 除运算
  • mod: 求余运算
  • pow: 乘方

Django框架

Redis

安装

服务器端

  • 服务器端的命令为redis-server

  • 可以使⽤help查看帮助⽂档

    redis-server --help

  • 个人习惯

    ps aux | grep redis 查看redis服务器进程
    sudo kill -9 pid 杀死redis服务器
    sudo redis-server /etc/redis/redis.conf 指定加载的配置文件

客户端

  • 客户端的命令为redis-cli

  • 可以使⽤help查看帮助⽂档

    redis-cli --help

  • 连接redis

    redis-cli

    image-20220324205344154

  • 运⾏测试命令

    ping

    image-20220324205359682

  • 切换数据库

  • 数据库没有名称,默认有16个,通过0-15来标识,连接redis默认选择第一个数据库

    select 10

    image-20220324205421583

配置

  • Redis的配置信息在/etc/redis/redis.conf下。

  • 查看

    sudo vi /etc/redis/redis.conf

核心配置选项

  • 绑定ip:如果需要远程访问,可将此⾏注释,或绑定⼀个真实ip

    bind 127.0.0.1

  • 端⼝,默认为6379

    port 6379

  • 是否以守护进程运⾏

    • 如果以守护进程运⾏,则不会在命令⾏阻塞,类似于服务
    • 如果以⾮守护进程运⾏,则当前终端被阻塞
    • 设置为yes表示守护进程,设置为no表示⾮守护进程
    • 推荐设置为yes

    daemonize yes

  • 数据⽂件

    dbfilename dump.rdb

  • 数据⽂件存储路径

    dir /var/lib/redis

  • ⽇志⽂件

    logfile “/var/log/redis/redis-server.log”

  • 数据库,默认有16个

    database 16

  • 主从复制,类似于双机备份。

    slaveof

参考资料

redis配置信息http://blog.csdn.net/ljphilp/article/details/52934933

服务器和客户端命令

服务器端

  • 服务器端的命令为redis-server

  • 可以使⽤help查看帮助⽂档

    redis-server --help

  • 个人习惯

    ps aux | grep redis 查看redis服务器进程
    sudo kill -9 pid 杀死redis服务器
    sudo redis-server /etc/redis/redis.conf 指定加载的配置文件

客户端

  • 客户端的命令为redis-cli

  • 可以使⽤help查看帮助⽂档

    redis-cli --help

  • 连接redis

    redis-cli

    image-20220324214845130

  • 运⾏测试命令

    ping

    image-20220324214904357

  • 切换数据库

  • 数据库没有名称,默认有16个,通过0-15来标识,连接redis默认选择第一个数据库

    select 10

    image-20220324214921891

数据操作

string

string类型

  • 字符串类型是 Redis 中最为基础的数据存储类型,它在 Redis 中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。在Redis中字符串类型的Value最多可以容纳的数据长度是512M。

保存

如果设置的键不存在则为添加,如果设置的键已经存在则修改

  • 设置键值

    set key value

  • 例1:设置键为name值为itcast的数据

    set name itcast

    image-20220324215054969

  • 设置键值及过期时间,以秒为单位

    setex key seconds value

  • 例2:设置键为aa值为aa过期时间为3秒的数据

    setex aa 3 aa

    image-20220324215105916

  • 设置多个键值

    mset key1 value1 key2 value2 …

  • 例3:设置键为a1值为python、键为a2值为java、键为a3值为c

    mset a1 python a2 java a3 c

    image-20220324215121504

  • 追加值

    append key value

  • 例4:向键为a1中追加值haha

    append a1 haha

    image-20220324215132758

获取

  • 获取:根据键获取值,如果不存在此键则返回nil

    get key

  • 例5:获取键name的值

    get name

  • 根据多个键获取多个值

    mget key1 key2 …

  • 例6:获取键a1、a2、a3的值

    mget a1 a2 a3

    image-20220324215146794

键命令
  • 查找键,参数⽀持正则表达式

    keys pattern

  • 例1:查看所有键

    keys *

    image-20220324215243699

  • 例2:查看名称中包含a的键

    keys a*

    image-20220324215304321

  • 判断键是否存在,如果存在返回1,不存在返回0

    exists key1

  • 例3:判断键a1是否存在

    exists a1

    image-20220324215314530

  • 查看键对应的value的类型

    type key

  • 例4:查看键a1的值类型,为redis⽀持的五种类型中的⼀种

    type a1

    image-20220324215328326

  • 删除键及对应的值

    del key1 key2 …

  • 例5:删除键a2、a3

    del a2 a3

    image-20220324215339774

  • 设置过期时间,以秒为单位

  • 如果没有指定过期时间则⼀直存在,直到使⽤DEL移除

    expire key seconds

  • 例6:设置键a1的过期时间为3秒

    expire a1 3

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TRQxM3bP-1680859355492)(https://gitee.com/Kawhildh/blog-image/raw/master/python/image-20220324215352239.png)]

  • 查看有效时间,以秒为单位

    ttl key

  • 例7:查看键bb的有效时间

    ttl bb

    image-20220324215409024

hash类型
  • hash⽤于存储对象,对象的结构为属性、值
  • 的类型为string

增加、修改

  • 设置单个属性

    hset key field value

  • 例1:设置键 user的属性nameitheima

    hset user name itheima

  • 设置多个属性

    hmset key field1 value1 field2 value2 …

  • 例2:设置键u2的属性nameitcast、属性age11

    hmset u2 name itcast age 11

    image-20220324215516942

获取

  • 获取指定键所有的属性

    hkeys key

  • 例3:获取键u2的所有属性

    hkeys u2

    image-20220324215529333

  • 获取⼀个属性的值

    hget key field

  • 例4:获取键u2属性name的值

    hget u2 name

    image-20220324215605847

  • 获取多个属性的值

    hmget key field1 field2 …

  • 例5:获取键u2属性nameage的值

    hmget u2 name age

    image-20220324215620744

  • 获取所有属性的值

    hvals key

  • 例6:获取键u2所有属性的值

    hvals u2

    image-20220324215641746

删除

  • 删除整个hash键及值,使⽤del命令

  • 删除属性,属性对应的值会被⼀起删除

    hdel key field1 field2 …

  • 例7:删除键u2的属性age

    hdel u2 age

    image-20220324215656414

可能出现的错误

image-20220324215710449

MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.

Redis被配置为保存数据库快照,但它目前不能持久化到硬盘。用来修改集合数据的命令不能用

  • 原因:
    • 强制关闭Redis快照导致不能持久化。
  • 解决方案:
    • 运行config set stop-writes-on-bgsave-error no 命令后,关闭配置项stop-writes-on-bgsave-error解决该问题。
list类型
  • 列表的元素类型为string
  • 按照插⼊顺序排序

增加

  • 在左侧插⼊数据

    lpush key value1 value2 …

  • 例1:从键为a1的列表左侧加⼊数据a 、 b 、c

    lpush a1 a b c

    image-20220328131949191

  • 在右侧插⼊数据

    rpush key value1 value2 …

  • 例2:从键为a1的列表右侧加⼊数据0、1

    rpush a1 0 1

    image-20220328132017192

  • 在指定元素的前或后插⼊新元素

    linsert key before或after 现有元素 新元素

  • 例3:在键为a1的列表中元素b前加⼊3

    linsert a1 before b 3

    image-20220328132025683

获取

  • 返回列表⾥指定范围内的元素

    • startstop为元素的下标索引
    • 索引从左侧开始,第⼀个元素为0
    • 索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素

    lrange key start stop

  • 例4:获取键为a1的列表所有元素

    lrange a1 0 -1

    image-20220328132036015

设置指定索引位置的元素值

  • 索引从左侧开始,第⼀个元素为0

  • 索引可以是负数,表示尾部开始计数,如-1表示最后⼀个元素

    lset key index value

  • 例5:修改键为a1的列表中下标为1的元素值为z

    lset a 1 z

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mv6MCFqf-1680859355497)(https://gitee.com/Kawhildh/blog-image/raw/master/python/image-20220328132048174.png)]

删除

  • 删除指定元素

    • 将列表中前count次出现的值为value的元素移除
    • count > 0: 从头往尾移除
    • count < 0: 从尾往头移除
    • count = 0: 移除所有

    lrem key count value

  • 例6.1:向列表a2中加⼊元素a、b、a、b、a、b

    lpush a2 a b a b a b

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yVXSSIEa-1680859393037)(null)]

  • 例6.2:从a2列表右侧开始删除2个b

    lrem a2 -2 b

  • 例6.3:查看列表a2的所有元素

    lrange a2 0 -1

    image-20220328132107759

set类型
  • ⽆序集合
  • 元素为string类型
  • 元素具有唯⼀性,不重复
  • 说明:对于集合没有修改操作

增加

  • 添加元素

    sadd key member1 member2 …

  • 例1:向键a3的集合中添加元素zhangsanlisiwangwu

    sadd a3 zhangsan sili wangwu

    image-20220328132145460

获取

  • 返回所有的元素

    smembers key

  • 例2:获取键a3的集合中所有元素

    smembers a3

    image-20220328132154699

删除

  • 删除指定元素

    srem key

  • 例3:删除键a3的集合中元素wangwu

    srem a3 wangwu

image-20220328132204159

zset类型
  • sorted set,有序集合
  • 元素为string类型
  • 元素具有唯⼀性,不重复
  • 每个元素都会关联⼀个double类型的score,表示权重,通过权重将元素从⼩到⼤排序
  • 说明:没有修改操作

增加

  • 添加

    zadd key score1 member1 score2 member2 …

  • 例1:向键a4的集合中添加元素lisiwangwuzhaoliuzhangsan,权重分别为4、5、6、3

    zadd a4 4 lisi 5 wangwu 6 zhaoliu 3 zhangsan

获取

  • 返回指定范围内的元素

  • start、stop为元素的下标索引

  • 索引从左侧开始,第⼀个元素为0

  • 索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素

    zrange key start stop

  • 例2:获取键a4的集合中所有元素

    zrange a4 0 -1

    image-20220328132304358

  • 返回score值在minmax之间的成员

    zrangebyscore key min max

  • 例3:获取键a4的集合中权限值在5和6之间的成员

    zrangebyscore a4 5 6

    image-20220328132314025

  • 返回成员memberscore

    zscore key member

  • 例4:获取键a4的集合中元素zhangsan的权重

    zscore a4 zhangsan

    image-20220328132321679

删除

  • 删除指定元素

    zrem key member1 member2 …

  • 例5:删除集合a4中元素zhangsan

    zrem a4 zhangsan

    image-20220328132331353

  • 删除权重在指定范围的元素

    zremrangebyscore key min max

  • 例6:删除集合a4中权限在5、6之间的元素

    zremrangebyscore a4 5 6

    image-20220328132340871

爬虫

1

requests入门

https://www.runoob.com/python3/python-requests.html

2数据解析与提取

数据解析

三种解析⽅式: 1. re解析 2. bs4解析 3. xpath解析

正则表达式

https://www.runoob.com/regexp/regexp-syntax.html

  • . 匹配除换⾏符以外的任意字符 相等于 [^\n\r]
  • \w 匹配字⺟或数字或下划线
  • \s 匹配任意的空⽩符
  • \d 匹配数字
  • \n 匹配⼀个换⾏符
  • \t 匹配⼀个制表符
  • ^ 匹配字符串的开始
  • $ 匹配字符串的结尾
  • \W 匹配⾮字⺟或数字或下划线
  • \D 匹配⾮数字
  • \S 匹配⾮空⽩符
  • a|b 匹配字符a或字符b
  • () 匹配括号内的表达式,也表示⼀个组
  • […] 匹配字符组中的字符
  • [^...] 匹配除了字符组中字符的所有字符

限定符

字符描述
*匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。***** 等价于 {0,}。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-COCeViqy-1680859355501)(python.assets/image-20220918212500823.png)]
+匹配前面的子表达式一次或多次。例如,zo+ 能匹配 “zo” 以及 "zoo",但不能匹配 “z”+ 等价于 {1,}
?匹配前面的子表达式零次或一次。例如,do(es)? 可以匹配 “do”“does”“doxy” 中的 “do”? 等价于 {0,1}。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P4H0Y5mK-1680859355501)(python.assets/image-20220918212704639.png)]
{n}n 是一个非负整数。匹配确定的 n 次。例如,o{2} 不能匹配 “Bob” 中的 o,但是能匹配 “food” 中的两个 o
{n,}n 是一个非负整数。至少匹配n 次。例如,o{2,} 不能匹配 “Bob” 中的 o,但能匹配 “foooood” 中的所有 oo{1,} 等价于 o+o{0,} 则等价于 o*
{n,m}m 和 n 均为非负整数,其中 n <= m。最少匹配 n 次且最多匹配 m 次。例如,o{1,3} 将匹配 “fooooood” 中的前三个 oo{0,1} 等价于 o?。请注意在逗号和两个数之间不能有空格。
匹配中文字符 [\u4e00 -\u9fa5]

表达式 .* 就是单个字符匹配任意次,即贪婪匹配。 表达式 .*? 是满足条件的情况只匹配一次,即最小匹配.

str: 玩⼉吃鸡游戏, 晚上⼀起上游戏, ⼲嘛呢? 打游戏啊 

reg: 玩⼉.*?游戏 

此时匹配的是: 玩⼉吃鸡游戏 

reg: 玩⼉.*游戏  

此时匹配的是: 玩⼉吃鸡游戏, 晚上⼀起上游戏, ⼲嘛呢? 打游 戏

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pag95p0O-1680859355502)(python.assets/image-20220919151438809.png)]

# findall:  匹配字符串中所有的符合正则的内容
lst = re.findall(r"\d+", "我的电话号是:10086, 我女朋友的电话是:10010")
print(lst)

# finditer: 匹配字符串中所有的内容[返回的是迭代器], 从迭代器中拿到内容需要.group()
it = re.finditer(r"\d+", "我的电话号是:10086, 我女朋友的电话是:10010")
for i in it:
    print(i.group())

# search, 找到一个结果就返回, 返回的结果是match对象. 拿数据需要.group()
s = re.search(r"\d+", "我的电话号是:10086, 我女朋友的电话是:10010")
print(s.group())


# match是从头开始匹配
s = re.match(r"\d+", "10086, 我女朋友的电话是:10010")
print(s.group())

# 预加载正则表达式
obj = re.compile(r"\d+")

ret = obj.finditer("我的电话号是:10086, 我女朋友的电话是:10010")
for it in ret:
    print(it.group())

ret = obj.findall("呵呵哒, 我就不信你不换我1000000000")
print(ret)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值