Python 函数(二)

news2024/11/25 0:43:11

Python 函数(二)

一、可变参数、不可变参数

​ 什么是可变类型,什么又是不可变类型? 这里我们首先要了解一个东西,在计算机程序中我们定义一个变量,并对其存储一个数值。这里有两个关键概念:内存地址 和 对象数值。内存地址如0xa23c87a(举例,实际长度根据cpu位数不同而不同)为一个位置点。存储地址对应的存储块里面记录的值为变量的数值(是有长度的,跟存储是内容有关)。

在这里插入图片描述

1. 可变类型

​ 即上面中对象对应的值(["H“,“E“,“L“,“L“,“O“])可以被修改且内存地址不变的时候那么,该变量为可变类型。如上面为一个列表类型,我么可以对其中下标为1的“E” 进行修改为其他字符,list1[1] = “H”,那么它的新值为[“H“,“H“,“L“,“L“,“O“];

2. 不可变类型

​ 如果上面的对象是一个字符串类型 如“HELLO”,我们虽然可以通过下标进行访问如str[1]打印出来“E”,但是我们如果通过str[1] 进行赋值,则会报错。你可能会任务 那我可以通过str = “new str”,不是也可以进行修改吗,没错。这样也可以修改 ,但是上面提到的他的内存地址将会发生改变。所以当内存地址不变时,数值无法改变的为不可变类型。

由此可见,可变类型与不可变类型主要区别在当一个对象的内存地址不变的时候,其值可以修改的为可变类型,其值不可改变的为可变类型。

3. python中可变类型与不可变类型种类

不可变类型:

  • 整型
  • 浮点型
  • 字符串
  • 元组

可变类型:

  • 列表
  • 字典
  • 集合

二、可变参数与不可变参数作为函数实参

​ 这里其实和其他语言相似,按址传值,和按值传值一样的意思。

1.可变参数作为函数实参

​ 当可变参数作为函数实参时,在函数内部对函数可变参数进行修改时,我们传入的对象值将发生改变,在函数结束后,传入的可变参数值会在函数外部同步发生改变,因为传入的参数的内存地址没有发生改变,而其存储的数据发生了改变。

2. 不可变参数作为函数实参

def is_change_val(lst):
    lst += lst


list1 = ['H', 'E', 'L', 'L', 'O']
print(f"入参为:{list1}, 内存位置为:{id(list1)}") #['H', 'E', 'L', 'L', 'O']
is_change_val(list1)
print(f"执行函数后,值为{list1}, 内存地址为:{id(list1)}") #['A', 'E', 'L', 'L', 'O']
print("===============")
str1 = "happy 2023"
print(f"入参为:{str1} , 内存位置为:{id(str1)}")
is_change_val(str1)
print(f"执行函数后,值为{str1}, 内存地址为:{id(str1)}")
"""打印:
入参为:['H', 'E', 'L', 'L', 'O'], 内存位置为:2878479782144
执行函数后,值为['H', 'E', 'L', 'L', 'O', 'H', 'E', 'L', 'L', 'O'], 内存地址为:2878479782144
===============
入参为:happy 2023 , 内存位置为:2878480171824
执行函数后,值为happy 2023, 内存地址为:2878480171824
"""

注意: 我们在上面定义的函数中,运算逻辑为 lst += lst, 这种是对lst的地址中的值进行直接修改。

如果修改为lst = lst +lst,则会先计算右边计算出一个新的值,然后会将新的地址付给lst。此时lst的作用域仅为函数内部并为一个局部变量,不会影响外部传入的值。

def is_change_val(lst):
    lst = lst+lst


list1 = ['H', 'E', 'L', 'L', 'O']
print(f"入参为:{list1}, 内存位置为:{id(list1)}") #['H', 'E', 'L', 'L', 'O']
is_change_val(list1)
print(f"执行函数后,值为{list1}, 内存地址为:{id(list1)}") #['A', 'E', 'L', 'L', 'O']
print("===============")
str1 = "happy 2023"
print(f"入参为:{str1} , 内存位置为:{id(str1)}")
is_change_val(str1)
print(f"执行函数后,值为{str1}, 内存地址为:{id(str1)}")
"""
入参为:['H', 'E', 'L', 'L', 'O'], 内存位置为:2629047406848
执行函数后,值为['H', 'E', 'L', 'L', 'O'], 内存地址为:2629047406848
===============
入参为:happy 2023 , 内存位置为:2629047796528
执行函数后,值为happy 2023, 内存地址为:2629047796528
"""

三、递归函数

​ 递归是一种编程思想,主要特点为函数内部调用自己,递归函数需要有一个出口。典型场景为变量文件夹下所有文件夹及子文件夹和文件。

代码举例:计算N以内的数字累加和。

def num_sum(num):
    if num == 1:
        return 1
    else:
        return num + num_sum(num - 1)
print(num_sum(4)) #10

四、 lambda 表达式

​ lambda 表达式即为 函数的另一种书写方式,但仅仅局限于 原函数只有一行代码,一个返回值,结构比较简单的函数。用于缩短代码,不太用去单独定义函数。

1. lambda 语法

function1 = lambda 参数列表 : 表达式

lambda 实现 一个返回指定值的函数:

fixnum =  lambda: 520
print(fixnum()) # 520

lambda 实现两数想加:

num_sum =  lambda a, b : a+ b
print(num_sum(1, 4)) # 5

lanbda 定义默认参数的函数:

 defarg = a , b, c=100: a+b+c
 print(1, 2) # 103

三目运算使用lambda实现函数封装

fn1 = lambda a, b: a if a > b else b
print(fn1(100, 200))

list 排序中使用lambda

students = [
{'name': 'TOM', 'age': 20},
{'name': 'ROSE', 'age': 19},
{'name': 'Jack', 'age': 22}]
# 按name值降序排列
students.sort(key=lambda x: x['name'], reverse=True)
print(students)

使用不定长参数与 键值对参数

lambda *args: 表达式
lambda **kwargs: 表达式

五、 高阶函数

​ 什么是高阶函数: 当一个函数的参数为另一个函数的时候,则这个函数为高阶函数。即有参数为函数参数时该函数就是高阶函数。这里这种用法有点和JavaScript类似,函数可以作为参数传入。java 等语言不具有这种特点。

​ python内置高阶函数:

1. map(fun, list)

对list中的每一个元素调用函数fun,将同样size大小的新列表作为map函数返回值返回。

举例:

list1 = [1, 2, 3, 4]
result = map(fun, list1)
print(type(result)) # <class 'map'>
print(list(result)) # [1, 4, 9, 16]

2. reduce(func, list)

​ reduce函数的参数有两个,他会将list中的值第一次拿 索引为 n和n+1 的传入计算,并返回一个结果x,将结果x与索引为n+2的进行计算,直到上一次func函数的结果X与索引为length-1的元素进行计算。

如计算列表数值累加:

from functools import reduce

my_list = [1, 2, 3, 4, 5]
def f(x1, x2):
	return x1 + x2

result = reduce(f, my_list)
print(result) # 16

3. filter(fun, list)

filter第一个函数参数为 入参为一个 返回值为boolean类型的函数,会将list中每一个元素带入到fun中计算,返回True的元素将会被保留下来,作为新列表中的一项返回。

过滤列表中的偶数:

my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def f(x):
return x % 2 == 0
result = filter(f, my_list)
print(list(result)) # [2, 4, 6, 8, 10]

4. sort用法

list.sort(func,[reverse]), sort⽤来对容器中元素进⾏排序.为list的一个内置函数。

l = ['abcdef','ghf','treh']
l.sort(key=lambda ele:len(ele))
print(l) # ['ghf', 'treh', 'abcdef']

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

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

相关文章

数码管显示(静态与动态)

文章目录 一、数码管简介二、数码管连接方式2.1 共阴极2.2 共阳极2.3 数码管真值表 三、数码管驱动方式3.1 静态显示3.2 动态显示四、Cyclone IV数码管原理图 五、模块代码六、引脚分配七、动态显示八、引脚分配 一、数码管简介 数码管分七段数码管和八段数码管。七段和八段的…

为什么不推荐在头文件中直接定义函数?

1. 函数的分文件编写 在C中&#xff0c;函数的分文件编写是一种让代码结构更加清晰的方法&#xff0c;通常可以分为以下几个步骤&#xff1a; 创建后缀名为 .h 的头文件&#xff0c;在头文件中写函数的声明&#xff0c;以及可能用到的其他头文件或命名空间创建后缀名为 .cpp …

ES6迭代器、Set、Map集合和async异步函数

目录 迭代器 Iterator 的作用 Iterator 的遍历过程 Set Map集合 map和对象区别? async异步函数 迭代器 迭代器&#xff08;Iterator&#xff09;就是这样一种机制。它是一种接口&#xff0c;为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署Iterator接口&…

自动化运维工具——Ansible学习(二)

目录 一、handlers和notify结合使用触发条件 1.新建httpd.yml文件 2.复制配置文件到ansible的files目录中 3.卸载被控机已安装的httpd 4.执行httpd.yml脚本 5.更改httpd.conf配置文件 6.使用handlers 7.重新执行httpd.yml脚本 8.检查被控机的端口号是否改变 9.handle…

矩阵乘法的硬件加速

矩阵乘法的硬件加速 这里的硬件加速是指&#xff0c;如果依靠算法&#xff0c;可以通过减少访存次数来加速。可以将数据预取到cache来减少访存次数。 矩阵相乘最简单的实现 寄存器平铺矩阵乘法 将矩阵划分成多个小的矩阵块&#xff0c;小的矩阵块可以存放在寄存器中&#xff0…

QT开发技巧之嵌入式linux QT的QCombobox显示空白的问题

1.问题 开发平台&#xff1a;imx6ull qt版本&#xff1a;5.12.9 在嵌入式linux上运行的qt&#xff0c;QCombobox显示空白&#xff0c;不能显示其中的文本内容 2.解决办法 选中QCombobox&#xff0c;在属性栏中将foucsPolicy由WheelFocus改成NoFocus就好了

用户、角色、权限、菜单--数据库设计

用户角色关联表--user_role id-------------------主键 user_id------------用户ID role_id-------------角色ID create_time------创建时间 is_deleted--------状态&#xff08;0&#xff1a;未删除 1&#xff1a;删除&#xff09; 角色权限关联表--role_permission id------…

【PHP面试题50】Redis的主从复制实现原理是怎么样的?如何保证数据一致性?数据延迟又该如何处理?

文章目录 一、前言二、主从复制的基本原理三、数据一致性的保证四、数据延迟的处理四、总结 一、前言 本文已收录于PHP全栈系列专栏&#xff1a;PHP面试专区。 计划将全覆盖PHP开发领域所有的面试题&#xff0c;对标资深工程师/架构师序列&#xff0c;欢迎大家提前关注锁定。 R…

OpenCv算子

目录 一、索贝尔(sobel)算子 二、沙尔(Scharr)算子 三、拉普拉斯算子 一、索贝尔(sobel)算子 边缘的定义: 边缘是像素值发生跃迁的位置&#xff0c;是图像的显著特征之一&#xff0c;在图像特征提取、对象检测、模式识别等方面都有重要的作用。 sobel算子对图像求一阶导数。…

【V8】【1. 内存布局、隐藏类Hidden Class】

JavaScript 中的对象是由一组组属性和值的集合。JavaScript 对象像一个字典&#xff0c;字符串作为键名&#xff0c;任意对象可以作为键值&#xff0c;可以通过键名读写键值。 在 ECMAScript 规范中定义了数字属性应该按照索引值大小升序排列&#xff0c;字符串属性根据创建时…

python将dataframe数据导入MongoDB非关系型数据库

文章目录 pymongo连接新建数据库和集合pandas导入数据插入数据数据查看 pymongo连接 import pymongo client pymongo.MongoClient("mongodb://localhost:27017/") dblist client.list_database_names() for db in dblist:print(db) #查看已有数据库admin bilibil…

apply()函数--Pandas

1. DataFrame.apply()函数 1.1 函数功能 对DataFrame沿着指定轴运用函数。 函数接收到的对象是Series对象&#xff0c;它们的索引可以是DataFrame的行索引&#xff08;axis0&#xff09;或列索引&#xff08;axis1&#xff09;。结果为Series或DataFrame。 1.2 函数语法 Da…

java基础浮点类型

目录 1&#xff1a;float类型和double类型的定义 2&#xff1a;二者的范围和精度 3&#xff1a;float类型详解 3.1&#xff1a;整数位10进制转换为2进制 3.2&#xff1a;小数位10进制转换为2进制 3.3&#xff1a;把二进制放到浮点类型中 3.4&#xff1a;精度损失 4&…

手动下载composer项目放在vendor目录下并加载

比如添加easywechat。 说是手动&#xff0c;其实半手动。 到GitHub或gitee下载 1、下载后放在项目根目录下的vendor文件夹 2、在项目根目录的文件composer.json文件添加一段 "autoload": {"psr-4": {"EasyWeChat\\": "vendor/overtrue/wech…

9.带你入门matlab假设检验(matlab程序)

1.简述 函数 ztest 格式 h ztest(x,m,sigma) % x为正态总体的样本&#xff0c;m为均值μ0&#xff0c;sigma为标准差&#xff0c;显著性水平为0.05(默认值) h ztest(x,m,sigma,alpha) %显著性水平为alpha [h,sig,ci,zval] ztest(x,m,sigma,alpha,tail) %sig为观察…

3.5 Bootstrap 输入框组

文章目录 Bootstrap 输入框组基本的输入框组输入框组的大小复选框和单选插件按钮插件带有下拉菜单的按钮分割的下拉菜单按钮 Bootstrap 输入框组 本章将讲解 Bootstrap 支持的另一个特性&#xff0c;输入框组。输入框组扩展自 表单控件。使用输入框组&#xff0c;您可以很容易地…

SpringCloud Alibaba——Ribbon底层怎样实现不同服务的不同配置

目录 一、Ribbon底层怎样实现不同服务的不同配置二、源码角度分析 一、Ribbon底层怎样实现不同服务的不同配置 为不同服务创建不同的spring上下文&#xff0c;不同的spring上下文中存放对应这个服务所有的配置。 二、源码角度分析 SpringClientFactory中可以获取到所有ribbon…

自动化运维工具——Ansible学习(一)

目录 一、运维自动化发展历程及技术应用 (二)程序发布相关知识 (三)常用的自动化运维工具 二、Ansible入门 (一)Ansible发展史 (二)特点 (三)Ansible架构 (四)工作原理 (五)Ansible主要组成部分 (六) 安装步骤 1.各种安装方法与命令 (1)rpm包安装&#xff1a;EPEL源…

一篇文章让你学会Elasticsearch中的查询

还是惯例&#xff0c;开头先放章节目录&#xff0c;如果有帮到你的地方&#xff0c;欢迎点赞关注转发&#xff0c;如有错误&#xff0c;欢迎指出&#xff0c;不胜感激 一、环境初始化 version: 3.8 services:cerebro:image: lmenezes/cerebro:0.8.3container_name: cerebroport…

ylb-支付服务pay

总览&#xff1a; 在pay模块util包下&#xff0c;创建签名工具类Pkipair和http工具类HttpUtil&#xff1a; package com.bjpowernode.util;import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.securi…