python基础(Python高级特性(切片、列表生成式)、字符串的正则表达式、函数、模块、Python常用内置函数、错误处理)培训讲义

文章目录

  • 1. Python高级特性(切片、列表生成式)
    • a) 切片的概念、列表/元组/字符串的切片
      • 切片的概念
      • 列表切片
        • 基本索引
        • 简单切片
          • 超出有效索引范围
          • 缺省
        • 扩展切片
          • step为正数
          • step为负数
    • b) 列表生成式以及使用列表生成式需要注意的地方
      • 概念
      • 举例说明
        • 1. 生成一个列表,列表元素分别为 [1\*1,2\*2,3\*3……n\*n],假设n = 10。
        • 2. 接着上一个需求,要求返回的序列中不存在偶数项:
        • 3. 字符串s1 ='ABC',字符串 s2 = '123',要求:生成序列A1 A2 A3 B1 B2 B3 C1 C2 C3
  • 2. 字符串的正则表达式
    • 概念
    • Python中的正则表达式模块re
    • 正则表达式语法
    • 正则表达式函数
    • 示例
      • 1、re.match()方法
      • 2、re.search()方法
      • 3、re.findall()方法
      • 4、re.sub()方法
  • 3. 函数
    • a) 函数的概念
    • b) 函数的定义与调用
      • 函数名
      • 形参列表
      • 返回值
      • 实际运用举例
    • c) 函数的参数(位置参数、默认参数、关键字参数)
      • 举例说明
    • d) 递归函数(举一个简单的例子帮助理解)(选讲)
  • 4. 模块
    • 概念
    • a) 使用内置模块(如random、os、time等)
      • random模块常用函数
      • os模块常用函数
      • time模块常用函数
    • b) 使用第三方模块(安装,导入,使用、如requests等)
      • 安装
      • 导入
      • 使用
    • c) Import自己写的文件,相对导入和绝对导入
      • Python Modules模块
        • 举个例子
        • 导入模块
        • 单独运行模块
        • 利用相对路径引用包和模块
  • 5. Python常用内置函数
    • a) 求和函数sum
    • b) 排序函数sorted
    • c) 过滤函数filter
    • d) 其他函数(max、min、abs)
      • max
      • min
      • abs
    • e) 流程函数map(选讲)
  • 6.错误处理 (选讲)
  • 思考题
    • 为什么有len(a)和省略len(a)结果会不一样?
    • 找出1-10之间所有的偶数,并且返回一个列表(这个列表中含以这个偶数为半径的圆的面积)
    • 匹配手机号码
    • 匹配邮箱地址
    • 替换字符串

1. Python高级特性(切片、列表生成式)

a) 切片的概念、列表/元组/字符串的切片

切片的概念

在Python中,切片(slice)是对序列型对象(如list, string, tuple)的一种高级索引方法。普通索引只取出序列中一个下标对应的元素,而切片取出序列中一个范围对应的元素。

列表切片

基本索引

在这里插入图片描述

简单切片

简单切片指的是这样的切片形式:a[start:stop],其行为是得到下标在这样一个前闭后开区间范围内的元素,其中start和stop为负数时,简单看作是负数下标对应的位置即可:

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[2:3])
# [2]
print(a[5:9])
# [5, 6, 7, 8]
print(a[5:-1])
# [5, 6, 7, 8]
print(a[-5:9])
# [5, 6, 7, 8]
print(a[-5:-1])
# [5, 6, 7, 8]

两个比较特殊的情况:超出有效索引范围缺省。

超出有效索引范围

当start或stop超出上文提到的有效索引范围​时,切片操作不会抛出异常,而是进行截断

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[-100:5])
# [0, 1, 2, 3, 4]
print(a[5:100])
# [5, 6, 7, 8, 9]
print(a[-100:100])
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[100:1000])
# []

另外,如果start的位置比stop还靠后怎么办?Python还是不会抛出异常,而是直接返回空序列:

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[6:5])
# []
缺省

start和stop都是可以缺省的,在缺省的情况下,Python的行为是尽可能取最大区间,具体来说:

按照扩充索引范围的观点,start的缺省值是无穷小(​),stop的缺省值是无穷大(​)

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[:5])
# [0, 1, 2, 3, 4]
print(a[5:])
# [5, 6, 7, 8, 9]
print(a[100:])
# []
扩展切片

扩展切片指的是这样的切片形式:a[start:stop:step],其中step是一个非零整数,即比简单切片多了调整步长的功能,此时切片的行为可概括为:从start对应的位置出发,以step为步长索引序列,直至越过stop对应的位置,且不包括stop本身。事实上,简单切片就是step=1的扩展切片的特殊情况。需要详细解释的是step分别为正数和负数的两种情况。

step为正数

当step为正数时,切片行为很容易理解,start和stop的截断和缺省规则也与简单切片完全一致:

# step为正数
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[0:6:2])
# [0, 2, 4]
print(a[::2])
# [0, 2, 4, 6, 8]
print(a[:-2:2])
# [0, 2, 4, 6]
print(a[4::2])
# [4, 6, 8]
step为负数

当step为负数时,切片将其解释为从start出发以步长|step|逆序索引序列,此时,start和stop的截断依然遵循前述规则,但缺省发生一点变化,因为我们说过,在缺省的情况下,Python的行为是尽可能取最大区间,此时访问是逆序的,start应尽量取大,stop应尽量取小,才能保证区间最大,因此:

按照扩充索引范围的观点,start的缺省值是无穷大(​),stop的缺省值是无穷小(​)

# step为负数
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[5::-1])
# [5, 4, 3, 2, 1, 0]
print(a[:4:-2])
# [9, 7, 5]
print(a[::-1])
# [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

b) 列表生成式以及使用列表生成式需要注意的地方

概念

列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。

列表生成式的结构是在一个中括号里包含一个表达式,然后是一个for语句,然后是0个或多个for或者if语句。列表表达式可以是任意的,意思是你可以在列表中放入任意类型的对象。返回结果将是一个新的列表,在这个以if和for语句为上下文的表达式运行完成之后产生。

举例说明

1. 生成一个列表,列表元素分别为 [1*1,2*2,3*3……n*n],假设n = 10。

一般方法:

l1 = []
for i in range(1,11):
    l1.append(i*i)
print(l1)

列表生成式:

l2 = [i*i for i in range(1,11)]
print(l2)
2. 接着上一个需求,要求返回的序列中不存在偶数项:

一般形式:

l3 = []
for i in range(1,11):
    if i%2 != 0:
        l3.append(i*i)
print(l3)

列表生成式

l4 = [i*i for i in range(1,11) if i%2 != 0]
print(l4)
3. 字符串s1 =‘ABC’,字符串 s2 = ‘123’,要求:生成序列A1 A2 A3 B1 B2 B3 C1 C2 C3

列表生成式

l5 = [i+j for i in 'ABC' for j in '123']
print(l5)

一般模式

l6 = []
for i in 'ABC':
    for j in '123':
        l6.append(i+j)
print(l6)

2. 字符串的正则表达式

概念

正则表达式是一种用来描述字符串模式的文本。它由一些特殊字符和普通字符组成,可以用来匹配特定的字符串模式。例如,可以使用正则表达式匹配所有的电子邮件地址、所有的URL、所有的电话号码等。正则表达式不仅可以用来匹配字符串,还可以用来替换字符串,或者提取字符串中的某些部分。

Python中的正则表达式模块re

在Python中,正则表达式模块为re,它提供了一组函数和类,用于操作正则表达式。在使用re模块之前,需要先导入re模块,可以使用以下代码进行导入:

import re

正则表达式语法

正则表达式语法包括一些特殊字符和普通字符,它们组合起来形成了正则表达式模式。以下是一些常用的正则表达式语法:

  • . 表示匹配任意一个字符。
  • ^ 表示匹配字符串的开始位置。
  • $ 表示匹配字符串的结束位置。
  • *表示匹配前一个字符0次或多次。
  • +表示匹配前一个字符1次或多次。
  • ? 表示匹配前一个字符0次或1次。
  • \ 表示转义字符。
  • [] 表示字符集合,匹配其中任意一个字符。
  • [^] 表示字符集合取反,匹配不在其中的任意一个字符。
  • () 表示子模式,可以将多个字符组成一个整体,方便后续引用。
  • {n} 匹配n个前面表达式。例如,"o{2}“不能匹配"Bob"中的"o”,但是能匹配"food"中的两个o。
  • {n,} 精确匹配n个前面表达式。例如,"o{2,}“不能匹配"Bob"中的"o”,但能匹配"foooood"中的所有o。"o{1,}“等价于"o+”。"o{0,}“则等价于"o*”

特殊字符类

  • . 匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]’ 的模式。
  • \d 匹配一个数字字符。等价于 [0-9]。
  • \D 匹配一个非数字字符。等价于 [^0-9]。
  • \s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
  • \S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
  • \w 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]'。
  • \W 匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]’。

正则表达式函数

re模块提供了一组函数,用于操作正则表达式,常用的函数包括:

  • re.match(pattern, string, flags=0):尝试从字符串的开始位置匹配一个模式,如果匹配成功,则返回一个Match对象,否则返回None
  • re.search(pattern, string, flags=0):在字符串中搜索模式,如果匹配成功,则返回一个Match对象,否则返回None。
  • re.findall(pattern, string, flags=0):在字符串中查找模式,返回所有匹配成功的结果
  • re.sub(pattern, repl, string, count=0, flags=0):将字符串中所有匹配模式的部分替换为指定的字符串

参数说明:

  • pattern: 匹配的正则表达式
  • string: 要匹配的字符串。
  • flags: 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
    – re.I 使匹配对大小写不敏感
    – re.L 做本地化识别(locale-aware)匹配
    – re.M 多行匹配,影响 ^ 和 $
    – re.S 使 . 匹配包括换行在内的所有字符
    – re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
    – re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
  • repl : 替换的字符串,也可为一个函数。
  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

示例

下面通过一些示例来说明Python中正则表达式的使用。

1、re.match()方法

re.match()方法用于从字符串的开头开始匹配模式,如果匹配成功,则返回一个匹配对象;否则返回None。

import re

pattern = r"hello"
string = "hello world"

result = re.match(pattern, string)

if result:
    print("Match found!")
else:
    print("No match")

2、re.search()方法

re.search()方法用于在字符串中搜索匹配模式,如果找到任意位置的匹配,则返回一个匹配对象;否则返回None。

import re

pattern = r"world"
string = "hello world"

result = re.search(pattern, string)

if result:
    print("Match found!")
else:
    print("No match")

3、re.findall()方法

re.findall()方法用于在字符串中搜索所有匹配模式的子串,并将它们作为列表返回。

import re

pattern = r"\d+"
string = "I have 10 apples and 20 oranges."

result = re.findall(pattern, string)

print(result)  # Output: ['10', '20']

4、re.sub()方法

re.sub()方法用于在字符串中搜索匹配模式的子串,并将其替换为指定的字符串

import re

pattern = r"apple"
string = "I have an apple."

result = re.sub(pattern, "banana", string)

print(result)  # Output: "I have an banana."

3. 函数

a) 函数的概念

  • 函数是可以重复执行一定任务的代码片段,具有独立的固定的输入输出接口。
  • 函数定义的本质,是给一段代码取个名字,方便以后重复使用
  • 为了方便以后调用这个函数,在定义它的时候,就需要明确它的输入(参数)与输出(返回值)

b) 函数的定义与调用

定义函数的语法格式

def 函数名(形参列表):
    #可执行语句
    return 返回值

函数名

  • 只要是合法的标识符即可(同变量命名)
  • 为了提高可读性,建议函数名由一个或多个有意义的单词组成,单词之间用下划线_分隔,字母全部小写

形参列表

  • 在函数名后面的括号内,多个形参用逗号分隔,可以没有参数
  • 参数可以有默认值,可以用等号=直接指定默认值,有默认值的参数必须排最后
  • 没有默认值的参数,在调用的时候必须指定
  • 形参也可以没有,但是括号不能省略
  • 调用有默认值的参数要指定名字

返回值

  • 返回值可以没有,直接省略return这句话
  • 返回值可以是一个或多个,用逗号分隔,组合成一个元组
  • 返回值还可以是表达式
  • 多个返回值,不需要的用下划线顶替

实际运用举例

# 函数定义
def myfunc(arg1, arg2, arg3=None):
    ''' 
    This is a example for python documentation.
    这是一个为python函数提供文档的例子。
    arg1: 第一个参数的说明
    arg2: 第二个参数的说明
    arg3: 第三个参数的说明(这个参数有默认值)
    v1, v2, v3: 返回值的说明 
    '''
    v1 = arg1 + arg2
    v2 = arg1 * arg2
    if arg3 is None:
        v3 = arg1 + arg2
    else:
        v3 = arg1 + arg2 + arg3
    return v1, v2, v3
# 函数调用
v1, v2, v3 = myfunc(5, 3, arg3=4)
print(v1, v2, v3)    #8 15 12
 
# 使用arg3的默认值调用函数
v1, v2, v3 = myfunc(5, 3)
print(v1, v2, v3)    #8 15 8
 
# 忽略一个返回值
v1, v2, _ = myfunc(5, 3)
print(v1, v2, v3)    #8 15 8
 
# 看看返回值是元组tuple,在返回的过程中被自动解包
print(type(myfunc(5,3)))    #<class 'tuple'>

c) 函数的参数(位置参数、默认参数、关键字参数)

  • 函数的参数是参数与外部可变的输入之间交互的通道。
  • 函数的参数名称应该满足标识符命名规范,应该有明确的含义,可通过参数名称知道每个参数的含义。
  • 在函数定义下面的注释中逐个注明函数(和返回值)的含义,以便用户即使不甚了解函数中的具体内容也能正确无误的使用它。
  • 实参:实际参数,从外面传递来的实际的参数
  • 形参:形式参数,在函数内部它形式上的名字
  • 调用函数时,实参按照顺序位置与形参绑定,称为位置参数(Positional Argument)
  • 也可以在调用时,写明实参与形参的对应关系,称作传递关键字参数(Keyword Argument),这时候位置信息被忽略了
  • 同时传递位置参数与关键字参数,应该先传递位置参数,再传递关键字参数!
  • 函数定义的时候,可以指定默认值,但带默认值的参数必须列在参数列表的最后

举例说明

#举一个小栗子,计算纸箱子的体积
def cube_volume(length, width, height = 0.25):
    '''
    计算纸箱子的体积(单位:m)
    length: 长;    width: 宽
    height: 高(默认参数0.25)
    v: 返回值,纸箱的体积,单位m**3
    '''
    if length <= 0:
        print('length must larger than 0!')
        return 0
    if width <= 0:
        print('width must larger than 0!')
        return 0
    if height <= 0:
        print('height must larger than 0!')
        return 0
    v = length*width*height
    print('length = %.2f; width = %.2f; height = %.2f; cube volume = %.2f' % \
          (length, width, height, v))
    return v
 
# 使用位置参数调用
v = cube_volume(1, 2, 3)
# 使用关键字参数调用
v = cube_volume(width = 1, height = 2, length = 3)
# 位置参数和关键字参数混用
v = cube_volume(1, height = 2, width = 3)
 
# 关键字参数在位置参数之前会报错
# v = cube_volume(width = 1, 2, 3)

d) 递归函数(举一个简单的例子帮助理解)(选讲)

  • 一个函数里面调用它自己,称为递归。
  • 递归可以视作一种隐式的循环,不需要循环语句控制也可实现重复执行某段代码。
  • 递归在大型复杂程序中非常有用,在数值和非数值算法中都能大显身手!
  • 使用递归的时候要注意,当一个函数不断调用自己的时候,必须保证在某个时刻函数的返回值是确定的,即不再调用自己。

经典递归应用:斐波拉契数列

# 斐波那契数列(Fibonacci sequence)
def Fibonacci(n):
    ''' Fibonacci sequence
    f(0)=1, f(1) = 1, f(n) = f(n-1)+f(n-2)    	
    '''
    if n == 0 or n == 1:        
    	return 1
    else:      
    	return Fibonacci(n-1) + Fibonacci(n-2)

# 测试一下,注意n不要设的太大,python的递归效率是比较低的,太大会死机
print(Fibonacci(5))
# 斐波那契数列,前20位
print('Fibonacci sequence:')
for i in range(20):
    print('%d: %d' % (i,Fibonacci(i)))

4. 模块

概念

在刚入门python时,模块化编程、模块、类库等术语常常并不容易理清。尤其是Modules(模块)和Packages(包),在import引用时很容易混淆出错。

实际上,Python中的函数(Function)、类(Class)、模块(Module)、包库(Package),都是为了实现模块化引用,让程序的组织更清晰有条理。

👉通常,函数、变量、类存储在被称为模块(Module)的.py文件中,一组模块文件又组成了包(Package)。

👉将函数、变量、类存储在存储在独立的.py文件中,可隐藏代码实现的细节,将不同代码块重新组织,与主程序分离,简化主程序的逻辑,提高主程序的可读性。

👉 有了包和模块文件,可以在其他不同程序中进行复用,还可以使用其他人开发的第三方依赖库。

a) 使用内置模块(如random、os、time等)

random模块常用函数

随机数模块,该模块中定义了多个可产生各种随机数的函数。
在这里插入图片描述

import random
print(random.random())
print(random.randint(3,100))
rl = [2,1,3,4,2,2,1,4,5,6,2,5,2,1]
print(random.choice(rl))
print(random.uniform(1,2))

os模块常用函数

提供了访问操作系统服务的功能,该模块中常用函数如下表所示。
在这里插入图片描述

import os
print(os.getcwd())
print(os.path.abspath(os.getcwd()))
print(os.path.split(os.getcwd()))

time模块常用函数

在这里插入图片描述

import time
print(time.time())
print(time.localtime()) 
print("---start---")
time.sleep(2)  # 休眠2秒
print("-- end---")

b) 使用第三方模块(安装,导入,使用、如requests等)

以requests为例:

安装

对于第三方模块需要先进行安装操作

pip install requests

导入

安装好对应包后再项目中进行导入

import requests

使用

导入对应的包后即可在项目中使用包中的对应函数方法

response = requests.get('http://httpbin.org/get')
print(response.text)

将返回值以json形式打印

import requests
import json
 
response = requests.get("http://httpbin.org/get")
print(type(response.text))
print(response.json())
print(json.loads(response.text))
print(type(response.json()))

c) Import自己写的文件,相对导入和绝对导入

Python Modules模块

Modules模块是包含 Python 定义和语句的文件。以.py为后缀的文件名就是模块名称。

举个例子

我们创建了一个fibo.py文件,文件内容为:

# Fibonacci numbers module

def fib(n):    # write Fibonacci series up to n
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
    print()

def fib2(n):   # return Fibonacci series up to n
    result = []
    a, b = 0, 1
    while a < n:
        result.append(a)
        a, b = b, a+b
    return result

这里fibo.py就是一个模块,fib、fib2是fibo模块中的函数。

导入模块

如果我们想要在其他程序中使用fibo模块,可以有以下三种方式导入:
①导入整个模块

#import module_name
import fibo

可使用下面的语法来使用其中任何一个函数:

#module_name.func()
fibo.fib(10)

⭕ 注意:这里模块名+句点不可省略。

②导入模块中的特定函数

#from module_name import function_name
from fibo import fib, fib2

fib(10)

若使用这种语法,调用函数时就无需使用模块名+句点。
因为在import语句中已经显式地导入了函数fib和fib2,因此调用它时只需指定其名称。

③导入模块中的所有函数

#from module_name import *
from fibo import *

fib(20)

这种方式会导入除可下划线 (__)开头的名称以外的所有函数。

⭕ 注意:在大多数情况下,通常不推荐*这种用法,因为它可能会在解释器中引入了一组未知的名称,而且通常会导致代码可读性变差。

给导入的模块一个别名

# import module as m
import numpy as np

a = np.arange(100)

利用as给导入模块一个别名,简化代码中的调用写法。

单独运行模块

如果我们想单独测试下模块,可以在模块中添加以下代码,就可以既用作脚本,也可用作可导入模块:

if __name__ == "__main__":
    fib(10)
利用相对路径引用包和模块

这里的.可以访问同级目录下的包(Package)或者模块(Module)。
这里的..可以访问上一级目录下的包(Package)或者模块(Module)。

5. Python常用内置函数

a) 求和函数sum

描述
sum() 方法对序列进行求和计算。
语法
以下是 sum() 方法的语法:

sum(iterable[, start])

参数

  • iterable – 可迭代对象,如:列表、元组、集合。
  • start – 指定相加的参数,如果没有设置这个值,默认为0。

返回值
返回计算结果。

实例

print(sum([0,1,2]))
print(sum((2, 3, 4), 1)) # 元组计算总和后再加 1
print(sum([0,1,2,3,4], 2)) # 列表计算总和后再加 2

b) 排序函数sorted

描述
sorted() 函数对所有可迭代的对象进行排序操作。

sort 与 sorted 区别

sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。

list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。

语法
sorted 语法:

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

参数说明:

  • iterable – 可迭代对象。

  • key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。

  • reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)

返回值
返回重新排序的列表。

# b) 排序函数sorted
a = [5, 7, 6, 3, 4, 1, 2]
b = sorted(a)  # 保留原列表
print(a)
# [5, 7, 6, 3, 4, 1, 2]
print(b)
# [1, 2, 3, 4, 5, 6, 7]

L = [('f', 2), ('a', 1), ('c', 3), ('d', 4)]
L1 = sorted(L, key=lambda x: x[1])  # 利用key
L2 = sorted(L, key=lambda x: x[0])  # 利用key
print(L1)
# [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
print(L2)
# [('a', 1), ('c', 3), ('d', 4), ('f', 2)]


students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
res1 = sorted(students, key=lambda s: s[2])  # 按年龄排序
print(res1)
# [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

res2 = sorted(students, key=lambda s: s[2], reverse=True)  # 按降序
print(res2)
# [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]

res3 = sorted(students, key=lambda s: (s[1],s[2]))  # 按分类排序,分类相同按年龄
print(res3)
# [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

c) 过滤函数filter

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

该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中

语法
以下是 filter() 方法的语法:

filter(function, iterable)

参数

  • function – 判断函数。
  • iterable – 可迭代对象。

返回值
返回一个迭代器对象

实例
过滤出列表中的所有奇数:

def is_odd(n):
    return n % 2 == 1

tmplist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
newlist = list(tmplist)
print(newlist)
# [1, 3, 5, 7, 9]

过滤出1~100中平方根是整数的数:

import math
def is_sqr(x):
    return math.sqrt(x) % 1 == 0

tmplist = filter(is_sqr, range(1, 101))
newlist = list(tmplist)
print(newlist)
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

d) 其他函数(max、min、abs)

max

描述
max() 方法返回给定参数的最大值,参数可以为序列。

语法
以下是 max() 方法的语法:

max( x, y, z, .... )

参数

  • x – 数值表达式。
  • y – 数值表达式。
  • z – 数值表达式。

返回值
返回给定参数的最大值。

实例
以下展示了使用 max() 方法的实例:

print ("max(80, 100, 1000) : ", max(80, 100, 1000))
print ("max(-20, 100, 400) : ", max(-20, 100, 400))
print ("max(-80, -20, -10) : ", max(-80, -20, -10))
print ("max(0, 100, -400) : ", max(0, 100, -400))

以上实例运行后输出结果为:

max(80, 100, 1000) :  1000
max(-20, 100, 400) :  400
max(-80, -20, -10) :  -10
max(0, 100, -400) :  100

min

描述
min() 方法返回给定参数的最小值,参数可以为序列。

语法
以下是 min() 方法的语法:

min( x, y, z, .... )

参数

  • x – 数值表达式。
  • y – 数值表达式。
  • z – 数值表达式。

返回值
返回给定参数的最小值。

实例
以下展示了使用 min() 方法的实例:

print ("min(80, 100, 1000) : ", min(80, 100, 1000))
print ("min(-20, 100, 400) : ", min(-20, 100, 400))
print ("min(-80, -20, -10) : ", min(-80, -20, -10))
print ("min(0, 100, -400) : ", min(0, 100, -400))

以上实例运行后输出结果为:

min(80, 100, 1000) :  80
min(-20, 100, 400) :  -20
min(-80, -20, -10) :  -80
min(0, 100, -400) :  -400

abs

描述
abs() 函数返回数字的绝对值。

语法
以下是 abs() 方法的语法:

abs( x )

参数

  • x – 数值表达式,可以是整数,浮点数,复数。

返回值
函数返回 x(数字)的绝对值,如果参数是一个复数,则返回它的大小。

实例
以下展示了使用 abs() 方法的实例:

print ("abs(-40) : ", abs(-40))
print ("abs(100.10) : ", abs(100.10))

以上实例运行后输出结果为:

abs(-40) :  40
abs(100.10) :  100.1

e) 流程函数map(选讲)

描述
map() 函数会根据提供的函数对指定序列做映射

第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

语法
以下是 map() 方法的语法:

map(function, iterable, ...)

参数

  • function – 函数
  • iterable – 一个或多个序列

返回值
返回一个迭代器。

实例
以下实例展示了 map() 的使用方法:

def square(x) :         # 计算平方数
    return x ** 2
    
map_return = map(square, [1,2,3,4,5])    # 计算列表各个元素的平方
print(map_return)
# <map object at 0x0000022FB28CFA30>     # 返回迭代器
map_return_list = list(map(square, [1,2,3,4,5]))   # 使用 list() 转换为列表
print(map_return_list)
# [1, 4, 9, 16, 25]

6.错误处理 (选讲)

Python3 错误和异常
实例
使用 try…except…finally 语句

print("===== 错误处理 =====")
# 不加错误处理时:
a = 3
b = 0
# 这里会报除零错误
# print(a / b)

# 采用错误处理
try:
    print(a / b)
except ZeroDivisionError as ex1:  # 捕获除零错误
    print("除零错误!", ex1)
finally:
    print("程序结束")

print("===== 错误处理2 ======")
# 同时处理多种错误
c = 5
d = "ss"

try:
    print(c / d)
except ZeroDivisionError as ex1:
    print("除零错误!", ex1)
except TypeError as ex2:
    print("类型不对!必须都为数值!", ex2)
except Exception as ex3:
    print("未知错误!", ex3)
finally:
    print("程序结束!")

思考题

为什么有len(a)和省略len(a)结果会不一样?

# 为什么有len(a)和省略len(a)结果会不一样?
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[0::-1])
# [0]
print(a[0:len(a):-1])
# []

当step为负数时,切片将其解释为从start出发以步长|step|逆序索引序列,此时,start和stop的截断依然遵循前述规则,但缺省发生一点变化,因为我们说过,在缺省的情况下,Python的行为是尽可能取最大区间,此时访问是逆序的,start应尽量取大,stop应尽量取小,才能保证区间最大,因此:

按照扩充索引范围的观点,start的缺省值是无穷大(​),stop的缺省值是无穷小(​)

找出1-10之间所有的偶数,并且返回一个列表(这个列表中含以这个偶数为半径的圆的面积)

方法一:使用列表生成式,计算圆的面积要用到圆周率参数,需要导入math模块:

import math
print([math.pi * r * r for r in range(2,11,2)])

方法二:定义一个求圆面积的函数,然后在列表生成式中直接调用函数,从而求出序列中符合条件的半径的面积:

def square(r):
    res = math.pi * r *r
    return res
print([square(r) for r in range(2,11,2)])

匹配手机号码

手机号码由11位数字组成,通常以1开头。使用正则表达式可以匹配符合这种模式的手机号码。以下是一个匹配手机号码的正则表达式:

pattern = r'^1\d{10}$'

其中,^表示字符串的开始位置,1表示必须以1开头,\d表示匹配任意一个数字,{10}表示匹配前一个字符10次,$表示字符串的结束位置。可以使用re.match函数来匹配手机号码:

import re
​
pattern = r'^1\d{10}$'
string = '12312345678'
match = re.match(pattern, string)
if match:
    print('匹配成功')
else:
    print('匹配失败')

输出结果为:

匹配成功

匹配邮箱地址

邮箱地址通常包含@符号和.符号,使用正则表达式可以匹配符合这种模式的邮箱地址。以下是一个匹配邮箱地址的正则表达式:

pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'

其中,[a-zA-Z0-9._%±]表示匹配任意一个字母、数字、下划线、点、百分号、加号、减号,
+表示匹配前一个字符1次或多次,@表示匹配@符号,[a-zA-Z0-9.-]表示匹配任意一个字母、数字、点、减号,.[a-zA-Z]{2,}表示匹配.符号和至少两个字母的组合。可以使用re.match函数来匹配邮箱地址:

import re
​
pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
string = 'example@example.com'
match = re.match(pattern, string)
if match:
    print('匹配成功')
else:
    print('匹配失败')

输出结果为:

匹配成功

替换字符串

使用正则表达式可以替换字符串中符合特定模式的部分。以下是一个替换字符串的示例:

import re
​
pattern = r'\d+'
string = 'a1b2c3d4'
replacement = 'X'
new_string = re.sub(pattern, replacement, string)
print(new_string)

输出结果为:

aXbXcXdX

在上面的示例中,\d+表示匹配任意一个数字,re.sub函数将字符串中所有匹配到的数字替换为X


[Python]切片完全指南(语法篇)
python——列表生成式
【全文干货】python—函数详解(值得收藏的学习手册)
python中requests库使用方法详解
详解Python模块化——模块(Modules)和包(Packages)
Python sorted()函数的高级使用(多条件)
python 生成器 generator 详解
玩转Python正则表达式:实用教程带你快速入门
Python正则表达式入门
Python3 正则表达式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/120159.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构:AVL树的旋转(平衡搜索二叉树)

1、AVL树简介 AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1&#xff0c;所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis&#xff0c;他们…

双11购物节想入手一款音画好的智能电视,大家推荐一下吧?

智能家电更新太快,不想三五年后就淘汰,那就入手东芝电视Z700吧,Z700这次把观影体验和音箱效果做到哇塞,既然要享受生活那就要享受高品质的体验。东芝电视拥有70余年的原色调校技术,每款产品都有专属的日本调校工程师匠心打造,可以真实还原画面色彩,而且还有火箭炮音响系统,也是…

C++ 图解二叉树非递归后序 + 实战力扣题

145.二叉树的后序遍历 145. 二叉树的后序遍历 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> postorderTraversal(TreeNode* root) {stack<TreeNode*> st;vector<int> vec;if(root NULL) return vec;TreeNode* guard root…

大型企业是否有必要进行数字化转型?_数据治理平台_光点科技

数字化转型是大型企业在现代商业环境中保持竞争力的关键。一开始我们要明确数字化转型指的是利用数字技术来改变企业的业务模式和企业文化&#xff0c;以提高效率和效益。对于大型企业而言&#xff0c;进行数字化转型有着多重必要性。 1.数字化转型可以帮助企业优化内部流程&am…

记一次经典SQL双写绕过题目[极客大挑战 2019]BabySQL 1

题目环境&#xff1a; 作者已经描述进行了严格的过滤 做好心理准备进行迎接 判断注入类型 admin 1’ 字符型注入万能密码注入 admin 1’ or ‘1’1 报错 已经是字符型注入了&#xff0c;所以的话只有or这里存在了过滤 联想到buuctf里面还没有碰到双写绕过的题目 所以这里斗胆试…

ESXi配置两个不同网段虚拟机互通

ESXi配置两个不同网段虚拟机互通 拓扑图&#xff1a; 步骤 在ESXi上新建一个虚拟交换机新建两个端口组&#xff0c;VLAN ID分别为30和31&#xff0c;添加到新建的虚拟交换机上创建两个虚拟机&#xff0c;网络适配器分别使用新建的端口组30和31对新建的虚拟机配置IP在物理交换…

【计算机组成】实模式/保护模式下地址分段(基段地址+偏移地址)的原因

一.硬编码/静态重定向 我们先来观察下没有地址分段时代CPU是怎么和内存们打交道&#xff0c;在8086CPU以前的老大哥们&#xff0c;访问内存时通常就是实打实的“指哪打哪”&#xff0c;程序指定要放在哪个地址&#xff0c;那就老老实实地放在哪个地址&#xff0c;比如程序A要放…

微信小程序案例3-1 比较数字

文章目录 一、运行效果二、知识储备&#xff08;一&#xff09;Page()函数&#xff08;二&#xff09;数据绑定&#xff08;三&#xff09;事件绑定&#xff08;四&#xff09;事件对象&#xff08;五&#xff09;this关键字&#xff08;六&#xff09;setData()方法&#xff0…

Azure 机器学习 - 设置 AutoML 训练时序预测模型

目录 一、环境准备二、训练和验证数据三、配置试验支持的模型配置设置特征化步骤自定义特征化 四、可选配置频率和目标数据聚合启用深度学习目标滚动窗口聚合短时序处理非稳定时序检测和处理 五、运行试验六、用最佳模型进行预测用滚动预测评估模型精度预测未来 七、大规模预测…

《深入立即计算机系统》书籍学习笔记 - 第二课 - 位,字节和整型

Lecture 02 Bits,Bytes, and Integer 位&#xff0c;字节和整型 文章目录 Lecture 02 Bits,Bytes, and Integer 位&#xff0c;字节和整型Byte 字节位操作布尔代数集合的表现形式和操作C语言的逻辑操作 位移操作整型数值范围无符号与有符号数值无符号与有符号在C中 拓展和截断拓…

安防监控EasyCVR视频汇聚平台使用海康SDK播放时,画面播放缓慢该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。安防视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存储、…

物业报修管理软件哪个好?如何提升物业管理和维修服务质量?

在当前的数字化时代&#xff0c;物业管理软件在物业行业中的作用日益凸显。它不仅能够有效提升管理效率&#xff0c;还能够优化服务质量&#xff0c;拓展收入来源&#xff0c;推动智慧物业的全面实现。本文将深入探讨“的修”报修管理软件如何通过其独特的功能和优势&#xff0…

【机器学习】Kmeans聚类算法

一、聚类简介 Clustering (聚类)是常见的unsupervised learning (无监督学习)方法&#xff0c;简单地说就是把相似的数据样本分到一组&#xff08;簇&#xff09;&#xff0c;聚类的过程&#xff0c;我们并不清楚某一类是什么&#xff08;通常无标签信息&#xff09;&#xff0…

《009.Springboot+vue之进销存管理系统》

《009.Springbootvue之进销存管理系统》 项目简介 [1]本系统涉及到的技术主要如下&#xff1a; 推荐环境配置&#xff1a;DEA jdk1.8 Maven MySQL 前后端分离; 后台&#xff1a;SpringBootMybatisredis; 前台&#xff1a;vueElementUI; [2]功能模块展示&#xff1a; 1.用户管…

AC修炼计划(AtCoder Regular Contest 163)

传送门&#xff1a;AtCoder Regular Contest 163 - AtCoder 第一题我们只需要将字符串分成两段&#xff0c;如果存在前面一段比后面一段大就成立。 #include<bits/stdc.h> #define int long long using namespace std; typedef long long ll; typedef pair<int,int&g…

程序设计:控制台输出二叉树 二叉树的形象显示

本文指导你编写一个输出到字符控制台的形象的二叉树展示。 目录 一般的Tree显示方式 理想的显示方式 实现方法 计算显示位置 输出数据 计算显示位置的代码 输出数据的代码 一般的Tree显示方式 编写二叉树算法时调试是很头疼的&#xff0c;如何显示成一目了然的树结构呢…

Flink SQL DataGen Connector 示例

Flink SQL DataGen Connector 示例 1、概述 使用 Flink SQL DataGen Connector&#xff0c;可以快速地生成符合规则的测试数据&#xff0c;可以在不依赖真实数据的情况下进行开发和测试。 2、使用示例 创建一个名为 “users” 的表&#xff0c;包含 6 个字段&#xff1a;id…

PHP分类信息网站源码系统 电脑+手机+微信端三合一 带完整前后端部署教程

大家好啊&#xff01;今天源码小编来给大家分享一款PHP分类信息网站类源码系统。这款源码系统是一套专业的信息发布类网站综合管理系统&#xff0c;适合各类地方信息和行业分类站点建站。随着这几年我们国家网民爆炸式的增 长&#xff0c;网络信息也随之越来越庞大&#xff0c;…

为什么亚马逊的轻量应用服务器这么受欢迎 | 个人体验 | 优势所在

文章目录 &#x1f33a;前言⭐什么是轻量应用服务器&#x1f6f8;特点 &#x1f384;亚马逊轻量应用服务器体验如何&#x1f339;亚马逊轻量应用服务器的优势 &#x1f33a;前言 作为一为开发者&#xff0c;我们要开发部署一个自己的网站&#xff0c;要选择一个性能好的服务器…

算法训练 第六周

一、用栈实现队列 本题要求我们使用栈这个数据结构来模拟实现队列的各种操作&#xff0c;我们的具体思路是使用两个栈&#xff0c;将一个栈当作输入栈&#xff0c;用于压入 push传入的数据&#xff1b;另一个栈当作输出栈&#xff0c;用于 pop和 peek 操作。每次 pop 或 peek 时…