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

这篇具有很好参考价值的文章主要介绍了Python基础:函数和函数式编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

函数和函数式编程

函数

声明函数:

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 函数

内置函数:

函数—作用域

  • 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 对象,。如果要转换为列表文章来源地址https://www.toymoban.com/news/detail-530242.html

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))

到了这里,关于Python基础:函数和函数式编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【零基础入门学习Python---Python网络编程之django快速入门实践】

    🚀 Python 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验

    2024年02月16日
    浏览(39)
  • 【Python零基础学习入门篇⑤】——第五节:Python中的函数

    ⬇️⬇️⬇️⬇️⬇️⬇️ ⭐⭐⭐Hello,大家好呀我是陈童学哦,一个普通大一在校生,请大家多多关照呀嘿嘿😁😊😘 🌟🌟🌟 技术这条路固然很艰辛,但既已选择,该当坚毅地走下去,加油! 🌤️PUA: ” 你所看到的惊艳都曾平庸历练 **“**🚀🚀🚀 🍉🍉🍉 最后让我

    2024年02月04日
    浏览(47)
  • Python零基础学习7.2—Python自定义函数的综合应用

    本章我们加大一点难度,来让大家更好的掌握Python函数的使用技巧 来看例题: 任务描述 本关任务:素数问题函数。 (1)实现isPrime()函数,参数为整数。如果是素数,返回True,否则返回False。 (2)在(1)的基础上,编写一个函数listPrime(),该函数可以接受任意个数数据,返

    2024年02月03日
    浏览(51)
  • 🔥🔥Java开发者的Python快速进修指南:函数基础

    话不多说,今天我们要介绍的是函数。本系列文章追求短而精,今天我们将重点讨论函数以及与Java方法的区别。与Java方法不同,函数不需要像Java方法一样讲究修饰符等其他特性,它只需要使用\\\"def\\\"进行声明。另外,函数的参数也与Java方法有所不同,Java方法中不存在默

    2024年02月05日
    浏览(62)
  • Python零基础学习7.1—Python自定义函数的定义和调用

    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。 函数能提高应用的模块性,和代码的重复利用率。Python提供了许多内建函数,比如print()。但我们也可以自己创建函数来实现一些功能,这被叫做用户自定义函数。 下面来看几个例题: 任务描述 本关

    2024年02月04日
    浏览(53)
  • 从零开始学习Python基础语法:打开编程大门的钥匙

    重温Python,适合新手搭建知识体系,也适合大佬的温故知新~ 1.1 Python作为一种流行的编程语言的介绍 Python是一种流行的高级编程语言,以其简洁、易读和强大的特性而备受开发者欢迎。它由 Guido van Rossum 于 1991 年创建,并且在过去几十年中得到了广泛的发展和应用。 Python作

    2024年01月20日
    浏览(48)
  • Python爬虫学习日记——SSL证书验证

    问题引入:现在很多网站是使用HTTPS协议的,但是有些网站并没有设置好HTTPS证书,或者HTTPS的证书不被CA机构认可,这个时候访问这些网站就会报SSL证书错误 实例:访问https://www.ssr2.scrape.center/ 对于这种情况我们使用代码来爬取的效果 代码提示我们是SSL错误 因此如果就是要爬

    2024年02月16日
    浏览(55)
  • [Python物联网]Python基础知识和语法--控制流和函数--Python快速上手开发物联网上位机程序

    目录 一、前言         二、条件语句 三、循环语句         1.for循环         2.while循环 四、函数 五、总结         Python的控制流语句允许程序根据特定条件执行不同的代码块。Python中的常见控制流语句包括 条件语句 和 循环语句 。在本篇文章中,我们将讨论

    2024年02月04日
    浏览(65)
  • python教程 入门学习笔记 第3天 编程基础常识 代码注释 变量与常量

    编程基础常识 一、注释 1、对代码的说明与解释,它不会被编译执行,也不会显示在编译结果中 2、注释分为:单行注释和多行注释 3、用#号开始,例如:#这是我的第一个python程序 4、注释可以写在单独一行,也可以写在一句代码后面 5、不想执行编译,又不能删除的代码,可

    2024年02月14日
    浏览(51)
  • 【socket】从计算机网络基础到socket编程——Windows && Linux C语言 + Python实现(TCP+UDP)

    简单讲一下基础知识,便于后面代码的理解,建议大概浏览一下这一小节内容。这里讲的只是冰山一角,建议大家学习计算机网络相关知识,推荐几本书: 《计算机网络》(谢希仁) 《计算机网络 自顶向下方法》 《计算机网络技术》 《计算机网络基础及应用》 《Linux C从入

    2024年02月08日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包