Python语法基础(一)

🌈个人主页:羽晨同学 

💫个人格言:“成为自己未来的主人~”  

关键字参数和不定长参数

关键字参数主要体现在函数的调用上

使用关键字参数的好处是,可以不按照形参的参数传参

比如说,我们定义一个函数

def c1(name,age):print(f'姓名: {name}, 年龄:{age}')
c1("zhangsan",10)
c1(age=10,name="张三")

这个就是普通函数的定义,我们调用这个函数的时候,需要传入两个参数(因为形参数目是两个)。

我们接下来再来看下一个函数的定义。

def c1(name,age=0,address="北京"):print(f'姓名:{name},年龄:{age}.地址:{address}')
c1("张三",10)

在这个函数的定义当中,我们在形参中,对age和address进行了赋值,这样做的好处是,即使我们传入的参数小于三个,这个函数仍然可以成立。

并且,我们还可以使用关键字进行传参。

c1(name="张三",age="5")
c1(age=5,name="张三")
c1("李四",address='上海')

你看,这样是不是提高了代码的可读性。

系统函数中的关键字参数

初次之外,其中我们平常使用的系统函数中,都是有关键字参数的。

比如说:print

print(45,6,77,end='-------',sep='*')

那个end和sep就是系统函数中的关键字参数。

* 和**

这两个的区别主要在于

* 被当做元组处理

** 被当做字典处理

比如说,我们看下面的这两个代码。

def d1(*num):print(num)print(type(num))
d1()
d1(45)

def d2(**num):print(num)print(type(num))
d2()

 这个时候传参的时候,就必须写成变量等于什么的形式,例如:

d2(x=2,y=4,z=5) # 类似于字典的创建方式3

这种是类似于字典的创建方式。

在同一个函数当中,同种符号只能出现一次,但是*和**可以同时出现。

def d3(*num1,**num2):print(num1,num2)
d3(45,5,6,7,8,9,5)
d3(a=5)
d3(4,7,8,6,5,ac=5)

这个代码执行下来的结果如下图所示:

函数的本质,其实就是一个变量,函数名其实就是一个变量名。

name = "zhangsan" # 变量
def func1():      # 函数print("111111111")
print(type(name))  #<class 'str'>
print(type(func1)) #<class 'function'>
func1()

你看,是不是其实蛮相似的。

如果这个时候我们重新给func1进行复制,这样子可以吗?

func1=10

答案当然是可以的,但是这个时候func1的类型就发生了改变。

print(type(func1)) # <class 'int'>

我们前面说函数和变量是很类似的,与给函数赋值和给变量赋值,结果也是极其相似的,我们来看一下给变量的赋值。

name=[243,6,78,8]
print(type(name))  # <class 'list'>

我们可以看到的是,他的类型变成了列表。

而func1() 这个时候是不能进行调用的,是运行不起来的,因为这个时候它的类型发生了改变。

原来表示函数的含义消失了。

所以这个时候也给我们提了一个醒,那就是自定义标识符的时候,不要使用系统的函数名,否则会导致系统的函数失效。

print=32
print(print)
sum=327
print(sum(3,527))

这两个系统的函数都失去了原来的作用。并变成了自己赋给的int类型。

A函数可以作为B函数的参数或者返回值使用,只需要传递或返回函数名就可以了。

使用场景:闭包、高阶函数、装饰器等

大家可以先来看下面的这个场景。

def func1():num1=78
def func2():num2=13total = num1+num2print(total)
func2()

这个代码是会报错的,因为func1中的变量在func2中是无法直接使用的,因为两个的作用域并不相同。

那么应该怎么解决这个办法呢?

方法一:返回值

def func1():num1=78return num1
def func2():num2=13total = func1()+num2print('和: ',total)

 方法二:函数的嵌套定义

def func1():print('11111111---------start')num1=78def func2():print('2222222--------start')num2=13total = num1+num2print('和: ',total)print('222222----------end')print('11111111---------end')
func1()

这个其实我们需要着重讲一下。

首先,在上面的这个嵌套定义的代码中,执行结果是这样的。

print(num1) #num1只能在func1内部使用

当我们执行这个代码的时候,是会报错的,这是因为num1只能在func1内部使用

func2() #这里不能调用,这个func2只能在func1内部使用

这个代码执行也会报错,也是因为func2只能在func1的内部调用。那我们应该如何调用嵌套定义的函数呢?

方法一、直接在func1中调用

def func1():print('11111111---------start')num1=78def func2():print('2222222--------start')num2=13total = num1+num2print('和: ',total)print('222222----------end')#调用内部函数func2()func2()print('11111111---------end')
#调用外部函数func1()
func1()
def func1():print('11111111---------start')num1=78def func2():print('2222222--------start')num2=13total = num1+num2print('和: ',total)print('222222----------end')#调用内部函数func2()print('11111111---------end')func2()#调用外部函数func1()
func1()

方法二、将func2设置为func1的返回值,这种方式以后是常用的,主要应用在闭包或者装饰器当中。

def func1():print('11111111---------start')num1=78def func2():print('2222222--------start')num2=13total = num1+num2print('和: ',total)print('222222----------end')#调用内部函数func2()print('11111111---------end')# A函数作为B函数的返回值使用,只需要使用函数名可以return func2   # func2表示函数本身,func2()表示调用函数
f = func1() # f中存储的是func1的返回值
# print(f)  # f中存储的是func2函数
f() # 相当于调用fcun2()函数

闭包的使用

闭包的前提是函数的嵌套定义,在内部函数当中使用了外部函数的变量。

情况一

返回值

def func1():num1=78def func2():num2=13total = num1+num2print('和: ',total)return func2
f=func1()
f()

情况二

def func1(a,b,c):num1=78def func2():num2=13total = num1+num2print('和: ',total,a,b,c)return func2
f=func1(45,7,8)
f()

情况三

def func1(a,b,c):num1=78def func2(x,y):num2=13total = num1+num2print('和: ',total,a,b,c,x,y)return 'hello'return func2
f = func1(45,7,8)
x = f(4,7)
print(x)

f表示的是func2

无论是函数的嵌套定义还是闭包,本质还是一个函数,所以默认参数,关键字参数和不定长参数都可以正常使用

返回值也可以正常使用

所在在调用内外函数的时候,一定要注意参数的传参的问题

 

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

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

相关文章

音视频技术扫盲之预测编码的基本原理探究

预测编码是一种数据压缩技术&#xff0c;广泛应用于图像、视频和音频编码等领域。其基本原理是利用数据的相关性&#xff0c;通过对当前数据的预测和实际值与预测值之间的差值进行编码&#xff0c;从而实现数据压缩的目的。 一、预测编码的基本概念 预测编码主要包括预测器和…

Android BottomNavigationView 底部导航栏使用详解

一、BottomNavigationView简介 BottomNavigationView是官方提供可以实现底部导航的组件&#xff0c;最多支持5个item&#xff0c;主要用于功能模块间的切换&#xff0c;默认会包含动画效果。 官方介绍地址&#xff1a;BottomNavigationView 二、使用BottomNavigationView a…

【大数据学习 | Spark-Core】Spark提交及运行流程

spark的集群运行结构 我们要选择第一种使用方式 命令组成结构 spark-submit [选项] jar包 参数 standalone集群能够使用的选项。 --master MASTER_URL #集群地址 --class class_name #jar包中的类 --executor-memory MEM #executor的内存 --executor-cores NUM # executor的…

React中事件处理和合成事件:理解与使用

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

[241125] X-CMD 发布 v0.4.14:webtop-Linux 容器桌面;支持 PowerShell 环境;轻松搭建并测试蜜罐环境等

目录 X-CMD 发布 v0.4.14&#x1f4c3;Changelog&#x1f427; webtop -- Linux 桌面容器&#x1f5a5;️ pwsh&#x1f4bb; elv|fish|nu|onsh|tcsh&#x1f40b; endlessh&#x1f40b; cowrie&#x1f4f2; mosh&#x1f4bb; mac -- Mac 实用功能&#x1f386; ascii&#…

Jmeter中的测试片段和非测试原件

1&#xff09;测试片段 1--测试片段 功能特点 重用性&#xff1a;将常用的测试元素组合成一个测试片段&#xff0c;便于在多个线程组中重用。模块化&#xff1a;提高测试计划的模块化程度&#xff0c;使测试计划更易于管理和维护。灵活性&#xff1a;可以通过模块控制器灵活地…

linux实时操作系统xenomai看门狗(watchdog)机制及作用介绍

版权声明&#xff1a;本文为本文为博主原创文章&#xff0c;转载请注明出处 https://www.cnblogs.com/wsg1100。如有错误&#xff0c;欢迎指正。 文章目录 一、前言PREEMPT-RT&#xff08;RT Throttling&#xff09; 一、xenomai watchdog介绍二、xenomai watchdog工作原理三、…

【C语言】字符串左旋的三种解题方法详细分析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;方法一&#xff1a;逐字符移动法&#x1f4af;方法二&#xff1a;使用辅助空间法&#x1f4af;方法三&#xff1a;三次反转法&#x1f4af;方法对…

【大模型】LLaMA-Factory的环境配置、微调模型与测试

前言 【一些闲扯】 时常和朋友闲聊&#xff0c;时代发展这么快&#xff0c;在时代的洪流下&#xff0c;我们个人能抓住些什么呢。我问了大模型&#xff0c;文心一言是这样回答的&#xff1a; 在快速发展的时代背景下&#xff0c;个人确实面临着诸多挑战&#xff0c;但同时也充满…

Web 表单开发全解析:从基础到高级掌握 HTML 表单设计

文章目录 前言一、什么是 Web 表单?二、表单元素详解总结前言 在现代 Web 开发中,表单 是用户与后端服务交互的重要桥梁。无论是用户登录、注册、搜索,还是提交反馈,表单都无处不在。在本文中,我们将从基础入手,全面解析表单的核心知识点,并通过示例带你轻松掌握表单开…

nodepad配置c/c++ cmd快速打开创建项目文件

前提:下载MinGw,并且配置环境变量 点击阅读次篇文章配置MinGw 无论是哪个编译器&#xff0c;执行c文件都是经历以下步骤: 编译文件生成exe文件执行该exe文件 我们先手动完成这两部 手动编译文件使用指令 gcc {你的c文件} -o {生成文件名}生成exe文件 第二步运行exe直接点击该文…

打造优秀技术文档的三大方向

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Xcode15(iOS17.4)打包的项目在 iOS12 系统上启动崩溃

0x00 启动崩溃 崩溃日志&#xff0c;只有 2 行&#xff0c;看不出啥来。 0x01 默认配置 由于我开发时&#xff0c;使用的 Xcode 14.1&#xff0c;打包在另外一台电脑 Xcode 15.3 Xcode 14.1 Build Settings -> Asset Catalog Compliter - Options Xcode 15.3 Build S…

如何使用GCC手动编译stm32程序

如何不使用任何IDE&#xff08;集成开发环境&#xff09;编译stm32程序? 集成开发环境将编辑器、编译器、链接器、调试器等开发工具集成在一个统一的软件中&#xff0c;使得开发人员可以更加简单、高效地完成软件开发过程。如果我们不使用KEIL,IAR等集成开发环境&#xff0c;…

QUICK 调试camera-xml解析

本文主要介绍如何在QUICK QCS6490使能相机模组。QCS6490的相机基于CameraX的框架&#xff0c;只需通过配置XML文件&#xff0c;设置相机模组的相关参数&#xff0c;就可以点亮相机。本文主要介绍Camera Sensor Module XML和Camera Sensor XML配置的解析&#xff0c;这中间需要c…

数据结构 (11)串的基本概念

一、串的定义 1.串是由一个或者多个字符组成的有限序列&#xff0c;一般记为&#xff1a;sa1a2…an&#xff08;n≥0&#xff09;。其中&#xff0c;s是串的名称&#xff0c;用单括号括起来的字符序列是串的值&#xff1b;ai&#xff08;1≤i≤n&#xff09;可以是字母、数字或…

汽车渲染领域:Blender 和 UE5 哪款更适用?两者区别?

在汽车渲染领域&#xff0c;选择合适的工具对于实现高质量的视觉效果至关重要。Blender和UE5&#xff08;Unreal Engine 5&#xff09;作为两大主流3D软件&#xff0c;各自在渲染动画方面有着显著的差异。本文将从核心定位与用途、工作流程、渲染技术和灵活性、后期处理与合成四…

开源加密库mbedtls及其Windows编译库

目录 1 项目简介 2 功能特性 3 性能优势 4 平台兼容性 5 应用场景 6 特点 7 Windows编译 8 编译静态库及其测试示例下载 1 项目简介 Mbed TLS是一个由ARM Maintained的开源项目&#xff0c;它提供了一个轻量级的加密库&#xff0c;适用于嵌入式系统和物联网设备。这个项…

C语言数据结构——详细讲解 双链表

从单链表到双链表&#xff1a;数据结构的演进与优化 前言一、单链表回顾二、单链表的局限性三、什么是双链表四、双链表的优势1.双向遍历2.不带头双链表的用途3.带头双链表的用途 五、双链表的操作双链表的插入操作&#xff08;一&#xff09;双链表的尾插操作&#xff08;二&a…

MYSQL 表的增删改查(上)

目录 1.新增数据 2.查询数据 一般查询 去重查询 排序查询 关于NULL 条件查询 分页查询 1.新增数据 语法&#xff1a;insert into 表名[(字段1&#xff0c;字段2...)] values (值&#xff0c;值....); 插入一条新数据行&#xff0c;前面指定的列&#xff0c;要与后面v…