Python入门【可变参数、lambda表达式和匿名函数、eval()函数、递归函数、嵌套函数(内部函数)、 nonlocal关键字】(十二)

news2024/9/23 9:27:22

👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白
📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
🍂博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人

🔥🔥🔥 python入门到实战专栏:从入门到实战
🔥🔥🔥 Python爬虫开发专栏:从入门到实战
🔥🔥🔥 Python办公自动化专栏:从入门到实战
🔥🔥🔥 Python数据分析专栏:从入门到实战
🔥🔥🔥 Python前后端开发专栏:从入门到实战  

目录

 可变参数

lambda表达式和匿名函数

eval()函数

递归函数

嵌套函数(内部函数) 

nonlocal关键字


 可变参数

可变参数指的是“可变数量的参数”。分两种情况:

1、 *param (一个星号),将多个参数收集到一个“元组”对象中。

2、 **param (两个星号),将多个参数收集到一个“字典”对象中。

【操作】测试可变参数处理(元组、字典两种方式)

def f1(a,b,*c):
    print(a,b,c)
f1(8,9,19,20)

def f2(a,b,**c):
    print(a,b,c)

f2(8,9,name='gaoqi',age=18)
def  f3(a,b,*c,**d):
    print(a,b,c,d)
f3(8,9,20,30,name='tong',age=18)

 执行结果:

8 9 (19, 20)
8 9 {'name': 'tong', 'age': 18}
8 9 (20, 30) {'name': 'tong', 'age': 18}

强制命名参数

在带星号的“可变参数”后面增加新的参数,必须在调用的时候“强制 命名参数”。

def f1(*a,b,c):
    print(a,b,c)
#f1(2,3,4)   #会报错。由于a是可变参数,将2,3,4全部收集。造成b和c没有赋值。
f1(2,b=3,c=4)

执行结果:

(2,) 3 4

实时效果反馈

1. 如下关于可变参数的代码,调用时,错误的是:

def f1(a,b,*c):
    print(a,b,c)

def f2(a,b,**c):
    print(a,b,c)

    
def  f3(a,b,*c,**d):
    print(a,b,c,d)

A f1(8,9,19,20)

B f2(8,9,name='tong',age=18)

C f3(8,9,20,30,name='tong',age=18)

D f2(7)

2. 如下是强制命名参数,调用时,错误的是:

def f1(*a,b,c):
    print(a,b,c)

A f1(2,3,4)

B f1(2,b=3,c=4)

C f1(2,c=3,b=4)

D f1(20,c=3,b=4)

lambda表达式和匿名函数

lambda 表达式可以用来声明匿名函数。

lambda 函数是一种简单的、在 同一行中定义函数的方法。 lambda 函数实际生成了一个函数对象。

lambda 表达式只允许包含一个表达式,不能包含复杂语句,该表达式 的计算结果就是函数的返回值。

lambda 表达式的基本语法如下: 

lambda  arg1,arg2,arg3... :  <表达式>

arg1 arg2 arg3 为函数的参数。相当于函数体。运算结果是:表达式的运算结果。

 【操作】lambda表达式使用

f = lambda a,b,c:a+b+c
print(f)
print(f(2,3,4))
g = [lambda a:a*2,lambda b:b*3,lambda c:c*4]
print(g[0](6),g[1](7),g[2](8))

执行结果:

<function <lambda> at 0x0000000002BB8620>
9
12 21 32

实时效果反馈

1. 如下关于lambda表达式,错误的是:

f = lambda a,b,c:a+b+c
print(f(2,3,4))

A lambda 函数是一种简单的、在同一行中定义函数的方法

B lambda 函数实际生成了一个函数对象

C lambda 表达式只允许包含一个表达式,该表达式的计算结果就是 函数的返回值

D lambda 函数 f 不会生成函数对象,但是可以通过 f(2,3,4) 调用

eval()函数

功能:将字符串 str 当成有效的表达式来求值并返回计算结果。

语法: eval(source[, globals[, locals]]) -> value 

参数:

1 source :一个Python表达式或函数 compile() 返回的代码对象

2 globals :可选。必须是 dictionary

3 locals :可选。任意映射对象

#测试eval()函数

s = "print('abcde')"
eval(s)


a = 10
b = 20
c = eval("a+b")
print(c)


dict1 = dict(a=100,b=200)


d = eval("a+b",dict1)
print(d)

 ⚠️⚠️⚠️eval函数 会将字符串当做语句来执行,因此会被注入安 全隐患。比如:字符串中含有删除文件的语句。那就麻烦大了。因此,使用时候,要慎重!!!

 实时效果反馈

1. 如下关于 eval() 函数,错误的是:

a = 10
b = 20
c = eval("a+b")
print(c)

A eval(str) 函数的作用:将字符串 str 当成有效的表达式来求值并返 回计算结果。

B 上面代码的执行结果是: 1020

C eval函数 会将字符串当做语句来执行,因此会被注入,安全隐患

D 上面代码的执行结果是: 30

递归函数

1 递归(recursion)是一种常见的算法思路,在很多算法中都会用到。比如:深度优先搜索(DFS:Depth First Search)等。

2 递归的基本思想就是“自己调用自己” 

递归函数指的是:自己调用自己的函数,在函数体内部直接或间接 的自己调用自己。每个递归函数必须包含两个部分:

1 终止条件 表示递归什么时候结束。一般用于返回值,不再调用自己。

2 递归步骤 把第n步的值和第n-1步相关联。 

⚠️递归函数由于会创建大量的函数对象、过量的消耗内存和运 算能力。在处理大量数据时,谨慎使用。

 如下是一个简单的递归程序:

def my_recursion(n):
    print("start:" + str(n))
    if n == 1:
        print("recursion over!")
    else:
        my_recursion(n - 1)
    print("end:" + str(n))
my_recursion(3)

运算结果:

start:3
start:2
start:1
recursion over!
end:1
end:2
end:3

实时效果反馈

1. 如下关于递归函数,错误的是: 

A 递归函数指的是:自己调用自己的函数

B 深度优先搜索(DFS:Depth First Search)中使用了递归算法

C 在处理大量数据时,谨慎使用

D 递归函数可以不包含“终止条件”

【操作】 使用递归函数计算阶乘(factorial)

def factorial(n):
    if n==1:
        return 1
    return n*factorial(n-1)
print(factorial(5))

执行结果:

120

 

嵌套函数(内部函数) 

嵌套函数:在函数内部定义的函数!

def  outer():
    print('outer running...')
    def inner():
        print('inner running...')
    inner()
outer()

 执行结果:

outer running...
inner running...

上面程序中, inner() 就是定义在 outer() 函数内部的函数。 inner() 的定义 和调用都在 outer() 函数内部。

一般在什么情况下使用嵌套函数?

1 封装 - 数据隐藏 外部无法访问“嵌套函数”。

2 贯彻 DRY(Don’t Repeat Yourself) 原则

3 嵌套函数,可以让我们在函数内部避免重复代码。

4 闭包(后面会讲解)

【操作】使用嵌套函数避免重复代码

def printChineseName(name,familyName):
    print("{0} {1}".format(familyName,name))
def printEnglishName(name,familyName):
    print("{0} {1}".format(name, familyName))

使用1个函数代替上面的两个函数

def printName(isChinese,name,familyName):
    def inner_print(a,b):
        print("{0} {1}".format(a,b))
    if isChinese:
        inner_print(familyName,name)
    else:
        inner_print(name,familyName)
printName(True,"小七","童")
printName(False,"xiaotong","Bush")

实时效果反馈

1. 如下关于嵌套函数(内部函数),错误的是:

def  f1():
    print('f1 running...')
    def f2():
        print('f2 running...')
    f2()

A 调用 f1() ,则会执行: f1() 、 f2()

B 调用 f1() ,则只执行: f1() ,不会执行 f2()

C 嵌套函数:在函数内部定义的函数!

D 嵌套函数,可以让我们在函数内部避免重复代码。

nonlocal关键字

nonlocal 用来在内部函数中,声明外层的局部变量。

global 函数内声明全局变量,然后才使用全局变量

【操作】使用nonlocal声明外层局部变量

#测试nonlocal、global关键字的用法
a = 100
def outer():
    b = 10
    def inner():
        nonlocal  b         #声明外部函数的局部变量
        print("inner b:",b)
        b = 20
        global a            #声明全局变量
        a = 1000
    inner()
    print("outer b:",b)
outer()
print("a:",a)

 实时效果反馈

1. 如下关于 nonlocal 和 global 的说法,错误的是:

A nonlocal 用来声明外层的局部变量。

B global 用来声明全局变量。

C 函数内用 global 声明全局变量,然后才可以使用全局变量

D 函数内不用 nonlocal 声明变量,也可以使用外层的局部变量

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么对XMind思维导图加密?

在现代社会中&#xff0c;信息安全变得越来越重要。对于那些使用XMind思维导图来组织和管理重要信息的人来说&#xff0c;保护思维导图中的内容免受未经授权的访问变得至关重要。本文将介绍如何加密XMind思维导图&#xff0c;以确保您的信息安全。 什么是XMind思维导图&#x…

Qt中postevent造成内存泄漏问题的通用解决方案

在Qt中由QCoreApplication统一管理Qt事件的收发和销毁,其中sendEvent为阻塞式发送,用于单线程的事件发送;postevent为非阻塞式发送,构造事件的线程和接受事件的线程可以为两个线程。 最近在做一个个人项目ShaderLab 需要绘制OpenGL实时渲染的图像,由于OpenGL渲染基本都放…

Flowable-服务-消息任务

文章目录 定义图形标记XML内容集成Rabbitmq引入pom包配置rabbitmq 操作界面 定义 Mq 任务不是 BPMN 2.0 规范定义的官方任务&#xff0c;在 Flowable 中&#xff0c;Mq 任务是作为一种特殊的服务 任务来实现的&#xff0c;主要做Mq消息发送。 图形标记 由于 Mq 任务不是 BPM…

openGauss学习笔记-25 openGauss 聚集函数

文章目录 openGauss学习笔记-25 openGauss 聚集函数25.1 sum(expression)25.2 max(expression)25.3 min(expression)25.4 avg(expression)25.5 count(expression)25.6 count(*)25.7 delta25.8 mode() within group (order by value anyelement) openGauss学习笔记-25 openGauss…

Vue『卡片拖拽式课程表』

Vue『卡片拖拽式课程表』 概述 在本篇技术博客中&#xff0c;我们将介绍一个使用Vue实现的『卡片拖拽式课程表』。这个课程表允许用户通过拖拽课程卡片来安排不同的课程在时间表上的位置。我们将逐步讲解代码实现&#xff0c;包括课程表的布局、拖拽功能的实现&#xff0c;以…

mac使用brew切换node的版本号

借用的是这篇文章 》 mac 使用brew切换node版本 # 查看node的版本号 brew search node# 安装其他版本. 选择 node16版本 brew install node16# 如果你是第一次安装node的话&#xff0c;执行下面这个操作 brew link --overwrite --force node16# 如果你是第二次安装node的话&am…

一文教会你单向链表

目录 一、什么是链表&#xff1f; 1.链表的定义 2.链表的实现 2.1链表的定义 2.2创建一个链表 二、链表的各个接口 1.创建节点 2.头插(将新创建的节点作为头插入到链表中) 3.打印链表 4.尾插(将新创建的节点插入到链表的末端) 5.头删 6.尾删 7.查找 8.删除指定节点位…

C语言基础入门详解三

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 一、C语言之函数指针 #include<stdio.h> #include<stdlib.h> /**函数指针 …

基于BIM+AI的建筑能源优化模型【神经网络】

推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 AEC&#xff08;建筑、工程、施工&#xff09;行业的BIM 技术&#xff0c;允许在实际施工开始之前虚拟地建造建筑物&#xff1b; 这带来了许多有形和无形的好处&#xff1a;减少成本超支、更有效的协调、增强决策权等等。…

实例026 随机更换主界面背景

实例说明 如果开发的软件用户使用频率非常高&#xff0c;可以为程序设计随机更换背景的程序。这样不但可以使用户心情愉快&#xff0c;也增加了软件的人性化设计。下面的界面就是一个随机更换主界面的例子&#xff0c;效果如图1.26所示。 技术要点 随机更换主界面背景使用了…

MySql002——关系型数据库基础知识

前言&#xff1a;因为本专栏学习的是MySQL&#xff0c;而MySQL是关系型数据库&#xff0c;所以这篇文章就来介绍一些关系型数据库基础知识&#xff0c;至于其他知识小伙伴们可以自行学习&#xff0c;同时不足之处也欢迎批评指正&#xff0c;谢谢~ 一、MySQL关系型数据库(RDBMS)…

Flowable-服务-Http任务

目录 定义图形标记XML内容界面操作 定义 Http 任务不是 BPMN 2.0 规范定义的官方任务&#xff0c;在 Flowable 中&#xff0c;Http 任务是作为一种特殊的服务 任务来实现的&#xff0c;主要调用Http服务使用。 图形标记 由于 Http 任务不是 BPMN 2.0 规范的“官方”任务&…

05-向量的意义_n维欧式空间

线性代数 向量与其运算 向量是线性代数里面最基本的概念&#xff0c;它其实就是一维数组&#xff0c;由 N 个数构成的&#xff0c; X(X1, X2…Xn) 向量的维度可以是任意正整数&#xff0c;可以表示在 n 维空间中的位置或方向。向量本身是一维的&#xff0c; 但向量所处的空间…

JavaWeb+jsp+Tomcat的网上订餐项目

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88130029?spm1001.2014.3001.5503 技术&#xff1a;ssm jsp JDK1.8 MySQL5.7 Tomcat7.0.5 功能&#xff1a;普通用户与管理员两个登录&#xff0c;管理员可以进行商品的增删改&#xff0c;…

JAVA SE -- 第十二天

&#xff08;全部来自“韩顺平教育”&#xff09; 常用类 一、包装类 1、包装类的分类 ①针对八种基本数据类型相应的引用类型--包装类 ②有了类的特点&#xff0c;就可以调用类中的方法 ③ 基本数据类型包装类booleanBooleancharCharacterbyteByteshortShortintInteger…

基于STM32设计的人体健康检测仪

一、项目介绍 当前文章介绍基于STM32设计的人体健康检测仪。设备采用STM32系列MCU作为主控芯片&#xff0c;配备血氧浓度传感器&#xff08;使用MAX30102血氧浓度检测传感器&#xff09;、OLED屏幕和电池供电等外设模块。设备可以广泛应用于医疗、健康等领域。可以帮助医生和病…

Spring源码(三)Spring Bean生命周期

Bean的生命周期就是指&#xff1a;在Spring中&#xff0c;一个Bean是如何生成的&#xff0c;如何销毁的 Bean生命周期流程图 1、生成BeanDefinition Spring启动的时候会进行扫描&#xff0c;会先调用org.springframework.context.annotation.ClassPathScanningCandidateCompo…

【C++入门到精通】C++入门 —— 类和对象(了解类和对象)

目录 一、类和对象的历史由来 二、面向过程和面向对象的初步认识 三、类 1.引子 2.类的定义 3.类的访问限定符及封装 ⭕访问限定符 &#x1f6a9;访问限定符解释说明 &#x1f6a9;struct 与 class 的区别 1. 默认访问级别&#xff1a; 2. 继承权限&#xff08;默认的…

安全基础 --- html标签 + 编码

html标签 &#xff08;1&#xff09;detail标签 <details>标签用来折叠内容&#xff0c;浏览器会折叠显示该标签的内容。 <1> 含义&#xff1a; <details> 这是一段解释文本。 </details> 用户点击这段文本&#xff0c;折叠的文本就会展开&#x…

山西电力市场日前价格预测【2023-07-31】

日前价格预测 预测明日&#xff08;2023-07-31&#xff09;山西电力市场全天平均日前电价为294.49元/MWh。其中&#xff0c;最高日前电价为318.11元/MWh&#xff0c;预计出现在19: 30。最低日前电价为278.89元/MWh&#xff0c;预计出现在00: 15。 价差方向预测 1&#xff1a;实…