Python基础:函数和函数式编程

news2024/11/27 12:58:14

文章目录

  • 函数和函数式编程
    • 函数
    • 函数式编程

函数和函数式编程

函数

声明函数:

def hello():
    print("hello function!")

调用函数:

# 使用()调用
hello()#output:hello function!

# 没有(),则不进行调用,一切皆是对象,函数也是对象
print(hello)#output:<function hello at 0x000001EE36F1B3A0>
hello#output:<function __main__.hello()>
print(hello.__class__)#output:<class 'function'>
print(type(hello))#output:<class 'function'>
print(type(hello()))
#output:
#hello function!
#<class 'NoneType'>

xxx = hello
print(xxx.__name__)#output:hello

函数—可变不可变对象

可更改(mutable)与不可更改(immutable)对象

在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 函数的参数传递:

  • **不可变类型:**类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a的值,只是修改另一个复制的对象,不会影响 a 本身。
  • **可变类型:**类似 c++的引用传递,如列表,字典。如fun (la),则是将 la 真正的传过去,修改后fun外部的la也会受影响python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。

可变类型:

def changeme(mytest_List):
    mytest_List.append([1, 2, 3, 4])
    print("函数内取值:", mytest_List)
    return
#调用changeme函数
mytest_List = [100, 200, 300]
print(mytest_List)
changeme(mytest_List)
print("函数外取值:", mytest_List)
#output:
#[100, 200, 300]
#函数内取值: [100, 200, 300, [1, 2, 3, 4]]
#函数外取值: [100, 200, 300, [1, 2, 3, 4]]

不可变类型:

def change_int(a):
    a = 10
b = 3
change_int(b)
print(b)
#output:3

函数—参数

  1. 必备参数

    • 定义

      def func(p):
          print(f"p is {p}")
      
    • 调用

      func(1)#output:p is 1
      func(p=1)#output:p is 1
      
  2. 默认参数

    def func(a, b=1, c=2):
        print(f"a={a}, b={b}, c={c}")
    func(1, 1, 1)
    func(1, c=1)
    func(1)
    # output:
    # a=1, b=1, c=1
    # a=1, b=1, c=1
    # a=1, b=1, c=2
    
  3. 可变参数

    def func(a, *args, **kwargs):
        print(f"a={a}, args={args}, kwargs={kwargs}")
    func(1, 1, 1)
    func(1, c=1)
    func(1)
    func(1, 2, 3, x=8)
    # output:
    # a=1, args=(1, 1), kwargs={}
    # a=1, args=(), kwargs={'c': 1}
    # a=1, args=(), kwargs={}
    # a=1, args=(2, 3), kwargs={'x': 8}
    
  4. 可变参数调用

    # *变量名 元组传入参数
    args = (0, 10, 2)
    print(list(range(*args)))
    # output:
    # [0, 2, 4, 6, 8]
    
    # **变量名 字典传入参数
    from datetime import datetime
    print(datetime(year=1999, month=7, day=1))
    # output:
    # 1999-07-01 00:00:00
    
    kwargs = {"year":1999, "month":7, "day":1}
    print(datetime(**kwargs))
    # output:
    # 1999-07-01 00:00:00
    

函数—函数返回值

在函数体内使用return语句可以从函数中返回一个值并跳出函数的功能。

  • 多条return语句:

return语句可以放在函数中任何位置,当执行到第一个return语句时程序返回到调用程序。

  • 返回多个值:

如果需要返回多个值,则可以返回一个元组。

函数—Built-in 函数

内置函数:

image-20230704161917422

函数—作用域

  • LEGB解析顺序:Local, Enclosing, Global, Built-in

  • global关键字

    total = 100 # 这是一个全局变量
    def sum(arg1, arg2):
        total = arg1 + arg2 # 这里是局部变量
        print("函数内是局部变量:", total)
        return total
    sum(10, 20)
    print("函数外是全局变量:", total)
    # output:
    # 函数内是局部变量: 30
    # 函数外是全局变量: 100
    

    注意:

    • 全局变量大写首字母,局部变量全小写
    • 不要使用Built-in和关键字作变量/函数名
    • python中print函数需要返回值,如果你在print函数中没有返回值,那么print将会return None

全局语句global

在函数体中可以引用全局变量,但如果函数内部的变量名时第一次出现在赋值语句之前(变量赋值),则解释为定义局部变量。

如果要为定义在函数外的全局变量赋值,可以使用global语句,表明变量是在外面定义的全局变量。global语句可以指定多个全局变量。

#全局变量
Pi = 3.1415
E =2.71828
def my_func():
    global Pi #全局变量,于前面的全局变量Pi指向相同对象
    Pi = 3.1 #改变全局变量的值
    print("global Pi= ", Pi)#输出全局变量值
    E = 2.7 #局部变量,与前面的全局变量E指向不同的对象
    print("local E = ", E)#输出局部变量值

print("module Pi= ", Pi)
print("module E= ", E)
my_func()
print("module Pi= ", Pi)# 输出全局变量的值,该值在函数中已被更改
print("module E= ", E)
# output:
# module Pi=  3.1415
# module E=  2.71828
# global Pi=  3.1
# local E =  2.7
# module Pi=  3.1
# module E=  2.71828

非局部语句nonlocal

在函数体中可以定义嵌套函数,在嵌套函数中如果要为定义在上级函数体的局部变量赋值,可以使用nonlocal语句,表明变量不是所在块的局部变量,而是在上级函数体中定义的局部变量。

# module E=  2.71828
#%%
def outer_func():
    tax_rate = 0.17 #上级函数体中的局部变量
    print("outer func tax rate= ", tax_rate)#输出上级函数体中局部变量的值
    def inner_func():
        nonlocal tax_rate # 不是所在块的局部变量,而是在上级函数体中定义的局部变量
        tax_rate = 0.05 # 上级函数体中的局部变量重新赋值
        print("inner func tax rate= ", tax_rate) # 输出上级函数体中局部变量的值
    inner_func()
    print("outer func tax rate= ", tax_rate) # 输出上级函数体中局部变量的值(已更改)

outer_func()
# output:
# outer func tax rate=  0.17
# inner func tax rate=  0.05
# outer func tax rate=  0.05

函数式编程

函数式编程

input -> f1 -> f2 -> f3 ->f4 -> f5 -> output

函数式编程vs面向对象编程

  • First-class function,简化很多设计模式
  • 更简单的函数-更好编写和维护
  • 更容易做单元测试
  • 更容易跨线程,跨进程,甚至跨机器执行任务

匿名函数

lambda

优势:结构体简单,函数体简短场景适用,即用即弃

a = [0, 1, 2, 3, 4, 5]
result = filter(lambda x: x % 2 == 0, a)
print(list(result))
# output:[0, 2, 4]
  • filter()

filter(func, lst)函数⽤于过滤序列, 过滤掉不符合条件的元素, 返回⼀个 fifilter 对象,。如果要转换为列表

list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def func(x):
    return x % 2 == 0

result = filter(func, list1)
print(result)
print(list(result))

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

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

相关文章

Spring + Spring MVC + MyBatis+Bootstrap+Mysql酒店管理系统源码

IDEASpring Spring MVC MyBatisBootstrapMysql酒店管理系统源码 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.会员信息管理3.客房信息类型管理4.客房信息管理5.客房信息添加6.预定信息管理7.入住信息管理8.入住信息添加 三、部分代码UserMapper.javaUserController.j…

MySQl数据库第四课-------------努力------努力------努力

作者前言 欢迎小可爱们前来借鉴我的gtiee秦老大大 (qin-laoda) - Gitee.com —————————————————————————————————— 目录 sudo whoami who exit reboot、shutdown 软件安装 编辑器vim ————————————————————————…

9.2.2 【Linux】按键说明

第一部份&#xff1a;一般指令模式可用的按钮说明&#xff0c;光标移动、复制贴上、搜寻取代等 第二部份&#xff1a;一般指令模式切换到编辑模式的可用的按钮说明 第三部份&#xff1a;一般指令模式切换到命令行界面的可用按钮说明

公网远程连接Redis数据库「内网穿透」

文章目录 1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 保留一个固定tcp地址4.2 配置固定TCP地址4.3 使用固定的tcp地址连接 转载自cpolar极点云文章&#xff1a;公网远程连接Red…

Python_列表比较大小

比较原理 从第一个元素顺序开始比较&#xff0c;如果相等&#xff0c;则继续&#xff0c;返回第一个不相等元素得比较结果。如果所有元素比较均相等&#xff0c;则长的列表大&#xff0c;一样长则两列表相等。 示例 a [5, 6, 3] b [5, 4, 3, 1] # 返回第1个不相等同位元素…

计算机图形硬件(二) 5 - 3 图形工作站和观察系统、输入设备

1 图形工作站和观察系统 目前&#xff0c;大多数图形监视器以光栅扫描显示的方式工作&#xff0c;一般使用 CRT或平板系统。图形系统的范围从小型通用计算机系统到多监视器及超大幅面观察屏幕。个人计算机的屏幕分辨率从640x480到1280x1024屏幕对角线从12英寸到21英寸。多数通…

基于STM32的300W无刷直流电机驱动方案

如何驱动无刷电机&#xff1f; 近些年&#xff0c;由于无刷直流电机大规模的研发和技术的逐渐成熟&#xff0c;已逐步成为工业用电机的发展主流。围绕降低生产成本和提高运行效率&#xff0c;各大厂商也提供不同型号的电机以满足不同驱动系统的需求。现阶段已经在纺织、冶金、…

【macOS 系列】下载brew或其他依赖包提示连接超时的问题解决

在下载brew或其他依赖包提示连接超时 错误信息&#xff1a; curl: (7) Failed to connect to [raw.githubusercontent.com](http://raw.githubusercontent.com/) port 443 after 34 ms: Connection refused最简单的方式&#xff0c;就是修改DNS&#xff1a;为114.114.114.114…

网络互联设备(集线器、交换机、路由器)

文章目录 一、中继器和集线器二、网桥和交换机1&#xff09;交换机的三种转发方式2&#xff09;交换机的分类3&#xff09;交换机互连方式 三、路由及路由器1&#xff09;路由器的作用2&#xff09;路由器的逻辑结构3&#xff09;路由器的硬件组成4&#xff09;路由器启动过程 …

【遍历】LeetCode二叉树的遍历、深度系列

文章目录 LeetCode题号104. 二叉树的最大深度111. 二叉树的最小深度144. 94. 二叉树的前序、中序遍历&#xff08;DFS遍历&#xff09;589. 589. N 叉树的前、后序遍历543. 二叉树的直径102. 二叉树的层序遍历 LeetCode题号 简单 104. 二叉树的最大深度&#xff08;DFS遍历法分…

C# RotationDetector 图片旋转角度检测

效果 项目 VS2022.net4.8 OpenCvSharp4Sdcb.RotationDetector 代码 using OpenCvSharp; using Sdcb.RotationDetector; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using …

项目设计集合(人工智能方向):助力新人快速实战掌握技能、自主完成项目设计升级,提升自身的硬实力(不仅限NLP、知识图谱、计算机视觉等领域)

优质项目专栏&#xff1a;提升自身的硬实力&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实战掌握技能&#xff0c;助力用户更好利用 CSDN 平台&#xff0c;自主完成项目设计升级&#xff0c;提升自身的硬实力。 专栏订阅&#xff1a;项目大全提升自身的硬实力…

2023MWC精彩回顾 | 未来数字世界中的社交,游戏与娱乐

6月28日至6月30日&#xff0c;由GSMA主办的2023 MWC 上海世界移动通信大会&#xff08;简称“MWC 上海”&#xff09;启幕。「Paraverse平行云」参与组织并主持了本次大会中【未来数字世界中的社交&#xff0c;游戏与娱乐】的主题会议。 「Paraverse平行云」携手上海交通大学、…

中国物流,驶入大航海时代

出海的一体化&#xff0c;不仅仅是物流的一体化&#xff0c;更是产业链、供应链的一体化。在诸多问题下&#xff0c;想要帮助企业更好地出海&#xff0c;就不能只专注于自身的长板&#xff0c;而是需要先补齐短板。 作者|斗斗 编辑|皮爷 出品|产业家 出海时代真的要来了。…

CSAPP fall2015 深入理解计算机系统 lab1 datalab详解

Data Lab data lab 数据实验 这个数据实验请在linux机器上面运行&#xff0c;实测mac m1本跑不起来。windows没试过。 centos上需要安装好gcc运行环境。 如果跑不起来记得安装下面这个东西&#xff1a; yum -y install glibc-devel.i686 运行make btest的时候可能会有warni…

药物设计学笔记:导论篇

笔记来自《药物设计学》 文章目录 1.药物设计概述 1.药物设计概述 药品&#xff08;medicine&#xff09; 药物&#xff08;durg&#xff09; 辅料&#xff0c;药物是研究对象 留意 medicine 和 drug 的区别 药物来源包括天然来源和人工来源&#xff0c;前者如吗啡&#xff0…

Oracle数据库软件安装与卸载

Oracle数据库软件安装与卸载 实验目的及要求 学习Oracle12c数据库服务器软件和客户端软件的安 装与卸载,掌握客户端服务名的设置,建立客户端与服务器的网络连接,熟悉windows操作系统中Oracle相关服务的操作。理解数据库管理的基本架构。 &#xff08;1&#xff09;熟悉Oracle…

网讯wx1860接yt8521phy千兆网口调试

问题描述&#xff1a;网讯1860接yt8521phy出一路电口和3路光口都不通。 问题分析&#xff1a;影响网口不通一般有三个因素导致&#xff1a;固件、驱动、硬件。 固件&#xff1a;对于网口不通一般先确认固件是否烧写正确&#xff0c;咨询网讯FAE后将固件更新为&#xff1a;SF4…

人物建模软件是一种通过计算机技术和人工智能算法将真实人物可视化的创新工具

这种软件可以将现实中的人物形象转化为数字模型&#xff0c;使其在虚拟世界中栩栩如生。使用人物建模软件&#xff0c;用户可以轻松地创建自己或其他人的数字化人物形象&#xff0c;并赋予其丰富的人工智能功能。 人物建模软件具备高度的灵活性和逼真的效果。它可以通过多种方…

mysql 关于用户的练习

环境&#xff1a; (1) 创建用户 create user account1localhost identified by oldpwd1; 授予权限&#xff1a; #给表授予权限 grant select,insert on Team.player to account1localhost identified by oldpwd1;#给info字段授予update权限 grant update(info) on Team.pl…