Python基础07_推导式函数

devtools/2024/10/17 16:05:14/

目录

一、推导式

1、列表推导式

2、字典推导式

3、集合推导式

4、元组推导式

二、函数

1、定义函数

1.1 def语句

1.2 函数的调用

1.3 return语句

2、函数参数

3、返回值

4、匿名函数

5、变量作用域

6、函数的内存分配

7、函数自调用(递归)


一、推导式


 Python 推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体。

Python 支持各种数据结构的推导式:

  • 列表(list)推导式

  • 字典(dict)推导式

  • 集合(set)推导式

  • 元组(tuple)推导式

1、列表推导式

基本格式

python">'''
[ 表达式 for 自定义变量 in 可迭代对象 ]
[ 表达式 for 自定义变量 in 可迭代对象 if 真值表达式 ]
'''

 举例

python">'''生成1—10之间的数字,将其平方存入list01中。将list01中所有奇数存入list02中。将list01中所有大于5的偶数增加1后存入list03中。要求都用列表推导式
'''list01 = [x**2 for x in range(1,11)]
print(list01)  # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
list02 = [x for x in list01 if x%2 == 1]
print(list02)  # [1, 9, 25, 49, 81]
list03 = [x+1 for x in list01 if x%2 == 0 and x>5]
print(list03)  # [17, 37, 65, 101]

2、字典推导式

基本格式

python">'''
{ 键表达式: 值表达式 for 元素 in 集合 }{ 键表达式: 值表达式 for 元素 in 集合 if 条件 }
'''

举例

python">'''
以三个数字为键,三个数字的平方为值创建字典
'''
number = [2, 4, 6]dict01 = {x:x**2 for x in number}
print(dict01)  # {2: 4, 4: 16, 6: 36}

3、集合推导式

基本格式

python">'''
{ 表达式 for 元素 in 序列 }
{ 表达式 for 元素 in 序列 if 条件 }
'''

举例

python">set00 = tuple(range(6))set01 = {i**2 for i in set00}
print(set01)  # {0, 1, 4, 9, 16, 25}

4、元组推导式

基本格式

python">'''
( 表达式 for 元素 in 序列 )
( 表达式 for 元素 in 序列 if 条件 )
'''

举例

python">#生成一个包含数字 1~9 的元组
a = (x for x in range(1,10))
print(a)  # 返回的是生成器对象
print(tuple(a))  # 使用 tuple() 函数,可以直接将生成器对象转换成元组
# (1, 2, 3, 4, 5, 6, 7, 8, 9)

二、函数


1、定义函数

  • 什么是函数

    函数是可以重复执行的语句块,可以重复调用,是函数是面向过程编程的最小单位。

  • 作用

    用于封装语句块, 提高代码的重用性。

1.1 def语句

用来定义(创建)函数

python">def 函数名(形式参数列表):语句块

说明

  1. 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()

  2. 函数名是一个变量,不要轻易对其赋值

  3. 函数有自己的名字空间,在函数外部不可以访问函数内部的变量,在函数内部可以访问函数外部的变量,但不能轻易对其改变

  4. 函数的形参列表如果不需要传入参数,形式参数列表可以为空

  5. 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。

  6. 函数内容以冒号 : 起始,并且缩进。

  7. return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。

1.2 函数的调用
python">函数名(实际调用传递参数)

说明

  • 函数调用是一个表达式

  • 如果函数内没有return 语句,函数执行完毕后返回 None 对象

1.3 return语句
python">return [表达式]
#[] 代表 内部的内容可以省略

 说明

  1. return 语句后面的表达式可以省略,省略后相当于 return None

  2. 如果函数内部没有 return 语句, 则函数执行完毕后返回None, 相当于在最后一条语句后有一条return None

实例

python">def fun01():print("hello!")return 1re = fun01()  # hello!
print(re)  # 1

2、函数参数

python">'''函数参数实际参数(调用参数)位置传参序列实参关键字传参字典实参形式参数默认参数位置形参星号元组形参命名关键字形参双星号字典形参
'''
2.1 函数的调用传参
  • 位置传参

    实际参数传递时,实参和形参按位置来依次对应

  • 关键字传参

    实际参数传递时,实参和形参 按名称依次对应

注:位置传参要先于关键字传参

python">def myfun1(a, b, c):print('a=', a)print('b=', b)print('c=', c)## 位置传参
myfun1(1, 2, 3)
## 关键字传参
myfun1(c=33, a=11, b=22)
## 位置传参要先于关键字传参
myfun1(111, c=333, b=222)   # 正确# 序列实参:使用星号将序列拆分后,与形参进行对应
# 星号序列传参  *序列/元组 拆分后按照位置依次传给函数
list01 = [7,8,9]
myfun01(*list01)# 字典实参:使用双星号将字典拆分后,依次与形参对应
# 星号字典传参  **字典
dict01 = {"c":3,"b":2,"a":1}
myfun01(**dict01)
2.2 默认参数
python">def 函数名(形参名1=默认实参1, 形参名2=默认实参2, ... ):语句块
 2.3 位置形参和关键字形参
  • 位置形参

  • 星号元组形参(*args)

  • 命名关键字形参

  • 双星号字典形参(**kwargs)

python">def fun01(a, b, c):print(a)print(b)print(c)fun01(1,2,3)  # 位置形参
fun01(a=5, b=6, c=7)  # 关键字形参
fun01(1, c=5, b=8)  # 混合使用(位置形参要放在关键字之前)
2.4 可更改与不可更改对象 

python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。

  • 不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变 a 的值,相当于新生成了 a。

  • 可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。

python 函数的参数传递:

  • 不可变类型:值传递: 如整数、字符串、元组。如 fun(a),传递的只是 a 的值,没有影响 a 对象本身。如果在 fun(a) 内部修改 a 的值,则是新生成一个 a 的对象。

  • 可变类型:引用传递: 如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后 fun 外部的 la 也会受影响

3、返回值

函数可以使用return语句来返回一个或多个值。

如果没有明确的return语句,函数将默认返回None

4、匿名函数

在Python中,匿名函数通常使用lambda关键字来创建。匿名函数也被称为lambda函数,它是一种简单的、一行的函数,常用于临时需要一个小函数的地方。

python">lambda  [函数的参数列表]: 表达式

作用

  • 创建一个匿名函数对象

  • lambda是关键字,表示你正在定义一个匿名函数。

  • 同 def 类似,但不提供函数名

  • [函数的参数列表]是函数的参数,可以有零个或多个参数,参数之间用逗号分隔。

  • : 表达式是函数的返回值,通常是一个表达式,匿名函数会计算这个表达式并返回结果。

说明

  • lambda 表达式 的创建函数只能包含一个表达式
python">def myadd(x, y):return x+yre = myadd(3,4)
print(re)  # 7number = lambda x,y: x+y
print(number(5,7))  # 12

5、变量作用域

5.1 局部变量和全局变量

局部变量

  • 定义在函数内部的变量称为局部变量(函数的形参也是局部变量)

  • 函数内部的变量只能在函数内部或者函数内部的函数内部访问 ,函数外部不能访问

  • 局部变量在函数调用时才能够被创建,在函数调用之后会自动销毁

全局变量

  • 定义在函数外部,模块内部的变量称为全局变量

  • 全局变量, 所有的函数都可以直接访问(取值,但函数内部不能直接将其赋值改变)

python"># 全局变量
a = 100def fun01():a = 20def fun02():# 局部作用域a = 10print(a)fun02()fun01()  # 10
5.2 global关键字

在函数内部修改全局变量

python">def fun03():global aa = 200print(a)fun03()  # 200
print(a)  # 200
5.3 nonlocal关键字

 修改外部嵌套变量

python">def fun04():# 外部嵌套作用域a = 500def fun05():# 局部作用域nonlocal aa = 50fun05()print(a)fun04()  # 50
5.4 LEGB顺序
python">'''
LEGB顺序(访问数据)
L:本地作用域,指当前函数内部的变量
E:闭包函数外的函数作用域,指嵌套函数的外部函数中定义的变量
G:全局作用域,指模块级别定义的变量
B:内建作用域,指 Python 预定义的变量、函数等,如 `len`、`sum` 等
'''

6、函数的内存分配

1、将函数的代码存储到代码区,函数体中的代码不执行。

2、调用函数时,在内存中开辟空间(栈帧),存储函数内部定义的变量。

3、函数调用后,栈帧立即被释放。

若传入的是不可变的类型,则函数内部变量不能直接改变;

若传入的是可变的类型,则函数内部可以直接修改。

python">'''
不可变类型参数有:
- 数值型(整数,浮点数)
- 布尔值bool
- None 空值
- 字符串str
- 元组tuple可变类型参数有:
- 列表 list
- 字典 dict
- 集合 set
'''
python">a = 20
b = [1, 2, 3]
def fun01(data1, data2):data1 = 1data2[0] = 100fun01(a,b)
print(a)  # 20
print(b)  # [100, 2, 3]

7、函数自调用(递归)

函数直接或间接的调用自身

说明:

  • 递归一定要控制递归的层数,当符合某一条件时要终止递归调用(递归边界)

  • 几乎所有的递归都能用while循环来代替

递归的实现方法:

  • 先假设此函数已经实现

递归优缺点:

优点:

  • 递归可以把问题简单化,让思路更为清晰,代码更简洁

缺点:

  • 递归因系统环境影响大,当递归深度太大时,可能会得到不可预知的结果

python"># 阶乘
# 迭代思想
def fun01(n):re = 1i = 1while i <= n:re *= ii += 1return rere = fun01(5)
print(re)  # 120# 递归思想
def fun02(n):# 递归边界:返回条件if n == 1:return 1# 递归,调用自己re = n * fun02(n-1)return rere = fun02(5)
print(re)  # 120


http://www.ppmy.cn/devtools/126500.html

相关文章

【C++贪心】2086. 喂食仓鼠的最小食物桶数|1622

本文涉及知识点 C贪心 LeetCode2086. 喂食仓鼠的最小食物桶数 给你一个下标从 0 开始的字符串 hamsters &#xff0c;其中 hamsters[i] 要么是&#xff1a; ‘H’ 表示有一个仓鼠在下标 i &#xff0c;或者’.’ 表示下标 i 是空的。 你将要在空的位置上添加一定数量的食物桶…

基于Spring Boot的大创项目高效管理系统

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理大创管理系统的相关信息成为必然。开发合适…

性能工具之JMeter 通过Java API生成 BeanShell PreProcessor 脚本

文章目录 一、前言二、实现代码三、代码示例四、最后 一、前言 对于上一篇文章&#xff08;性能工具之 HAR 格式化转换JMeter JMX 脚本文件&#xff09;还是有点问题。大家在使用的情况需要注意。 如果多个接口相同 path 路径且不同参数进行查询如&#xff1a; 上面接口如果…

【linux009】文件操作命令篇 - touch 命令

文章目录 touch 命令1、基本用法2、常见选项3、举例4、注意事项 touch 命令 touch 是 Linux 系统中的一个常用命令&#xff0c;用于创建空文件或更新已有文件的时间戳。它既可以用来快速生成新文件&#xff0c;也可以用来修改文件的访问时间&#xff08;access time, atime&am…

【JVM】一文详解类加载器

文章目录 类加载器的概述类加载器的分类启动类加载器(Bootstrap ClassLoader )扩展类型加载器(ExClassLoader)系统类加载器(Application ClassLoader )总结 双亲委派机制概念双亲委派机制的优势 ClassLoaderfindClassdefineClassloadClass&#xff0c;findClass&#xff0c;def…

js 精确计算(加减乘除)

js 精确计算(加减乘除) 工具类CalcUtil.js class CalcUtil {// 两数相加calcAdd(num1, num2) {var r1, r2, m;try {r1 num1.toString().split(.)[1].length;} catch (e) {r1 0;}try {r2 num2.toString().split(.)[1].length;} catch (e) {r2 0;}m Math.pow(10, Math.max…

ESP32-C3实现非易失变量(Arduino IDE )

1效果 网页输入数据&#xff0c;串口打印数据。掉电后数据还在 2源码 #include <WiFi.h> // 包含WiFi库&#xff0c;用于处理WiFi连接 #include <WebServer.h> // 包含WebServer库&#xff0c;用于创建Web服务器 #include <Preferences.h> // 包含Prefere…

uni-app写的微信小程序如何体积太大如何处理

方法一&#xff1a;对主包进行分包处理&#xff0c;将使用url: /pages/components/equipment/equipment跳转页面的全部拆分为分包&#xff0c;如url: /pagesS/components/equipment/equipment 在pages.json中添加 "subPackages": [{ "root"…