python中的函数

1.函数的目的

  1. .避免代码冗余
  2. .增强可读性

2.函数的定义与调用

  1. # 定义函数 使用关键字def
  2. """
  3. 1.定义函数:
  4. def 函数名():
  5. 函数体
  6. """
  7.  
  8. def sayhello():
  9. print("hello")
  10.  
  11. """
  12. 2.调用函数:
  13. 函数名()
  14. """
  15. sayhello()

3.函数返回值

  1. # 函数的返回值
  2. """
  3. 1.什么都不写的情况下没有返回值
  4. 2.return # 没有返回值 # 结束函数
  5. 3.return None
  6. 4.return 变量
  7. """
  8.  
  9. def say_hello1():
  10. print("hello")
  11. print(say_hello1())
  12.  
  13. def say_hello2():
  14. print("hello")
  15. return
  16. print(say_hello2())
  17.  
  18. def say_hello3():
  19. print("hello")
  20. return None
  21. print(say_hello3())
  22.  
  23. def say_hello4():
  24. print("hello")
  25. return "hello"
  26. print(say_hello4())

序列解压

  1. # 序列的解压
  2. a, b, c, d = (1, 2, 3, 4)
  3. print(a, b, c, d) # 1 2 3 4
  4.  
  5. a, _, _, d = (1, 2, 3, 4)
  6.  
  7. print(a, d) # 1 4
  8.  
  9. a, *_ = (1, 2, 3, 4)
  10. *_, d = (1, 2, 3, 4)
  11. print(a, d) # 1 4
  12. # 字典、列表、集合同样适用
  13. a, b = {'name': 'eva', 'age': 18}
  14. print(a, b) # age name

多个返回值

  1. def demo():
  2. """多个返回值情况"""
  3. return 1, 2, 3, 'a'
  4.  
  5. """多个返回值,用一个变量接收时,得到的是一个元祖"""
  6. a = demo()
  7. print(a) # (1, 2, 3, 'a')
  8.  
  9. """适用同等个数的变量接收,个数不相同,报错"""
  10. a, b, c, d = demo()
  11. print(a, b, c, d)

4.函数的参数

实参与形参

  1. """
  2. 1.定义函数使用的是形参
  3. 2.调用函数使用的是实参
  4. """

  

传参

实参角度

1.按照位置传参

  1. def demo(x, y):
  2. print(x, y)
  3.  
  4. demo(10, 20)

2.按照关键字传参

  1. def demo(x, y):
  2. print(x, y)
  3.  
  4. demo(y=10, x=20)

3.位置与关键字混用(位置参数必须在关键字参数的前面)

  1. def demo(x, y):
  2. print(x, y)
  3.  
  4. demo(10, y=20) # 按照顺序

形参角度 : 位置参数必须传值

默认参数

  1. def info(name, sex='male'):
  2. """将变化值较小的设置成默认参数"""
  3. print(name, sex)
  4.  
  5. # 调用函数时。默认参数可以不传值
  6. info('a')
  7. info('a', 'female')
  1. def info(name, li=[]):
  2. """陷阱:默认参数是一个可变数据类型"""
  3. li.append(name)
  4. print(li)
  5.  
  6. info('a') # ['a']
  7. info('b') # ['a', 'b']

区别其他语言:

  1. package com.zzz
  2.  
  3. object Test {
  4. def demo(name: String, list: List[String] = Nil): List[String] = {
  5. return name :: list
  6. }
  7.  
  8. def main(args: Array[String]): Unit = {
  9. val a = demo("a")
  10. val b = demo("b")
  11. print(a, b) //(List(a),List(b))
  12. }
  13. }

动态参数

  1. """
  2. 动态参数:
  3. 按位置传值多余的参数都由args统一接收,保存成一个元组的形式
  4. """
  5.  
  6. def to_sum(*args):
  7. sum = 0
  8. print(args)
  9. for i in args:
  10. sum += i
  11. return sum
  12.  
  13. a = to_sum(1, 2, 3)
  14. print(a)
  15. # (1, 2, 3)
  16. #
  17. b = to_sum(1, 2, 3, 4)
  18. print(b)
  19.  
  20. # (1, 2, 3, 4)
  21. #
  22.  
  23. # 接收k-v类型的参数
  24.  
  25. def info(**kwargs):
  26. print(kwargs)
  27. print(kwargs['name'], kwargs['sex'])
  28.  
  29. info(name='a', sex='b')
  30. # {'name': 'a', 'sex': 'b'}
  31. # a b

5.命名空间及作用域

  1. """
  2. 1.python解释器开始执行之后,就在内存中开辟了一个空间
  3. 2.每当遇到一个变量的时候,就把变量名和值之间的对应关系记录下来
  4. 3.当遇到函数定义的时候解释器只是象征性的将函数名读入内存,表示知道这个函数的存在了,至于函数内部的变量和逻辑解释器根本不关心
  5. 4.等执行到函数调用的时候,python解释器会再开辟一块内存来存储这个函数里的内容,
  6. 这个时候,才关注函数里面有哪些变量,而函数中的变量会存储在新开辟出来的内存中。
  7. 函数中的变量只能在函数的内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。
  8.  
  9. 创建的存储“变量名与值的关系”的空间叫做全局命名空间,在函数的运行中开辟的临时的空间叫做局部命名空间
  10. """
  1. # globals和locals方法
  2. print(globals())
  3. print(locals()) # 这中情况下,两种是一样的
  4.  
  5. def func():
  6. a = 12
  7. b = 20
  8. print(locals()) # {'b': 20, 'a': 12}
  9. print(globals())
  10.  
  11. func()
  1. #global 关键字
  2. a = 10
  3. def func():
  4. global a
  5. a = 20
  6.  
  7. print(a) #10
  8. func()
  9. print(a) #20

6.函数嵌套

  1. def f1():
  2. print("in f1")
  3. def f2():
  4. print("in f2")
  5.  
  6. f2()
  7. f1()
  1. """
  2. nonlocal关键字
  3. # 1.外部必须有这个变量
  4. # 2.在内部函数声明nonlocal变量之前不能再出现同名变量
  5. # 3.内部修改这个变量如果想在外部有这个变量的第一层函数中生效
  6. """
  7.  
  8. def f1():
  9. a = 1
  10.  
  11. def f2():
  12. a = 2
  13.  
  14. f2()
  15. print('a in f1 : ', a)
  16.  
  17. f1() # a in f1 : 1
  18.  
  19. def f1():
  20. a = 1
  21.  
  22. def f2():
  23. nonlocal a
  24. a = 2
  25.  
  26. f2()
  27. print('a in f1 : ', a)
  28.  
  29. f1() # a in f1 : 2

7.函数名的本质

  1. """函数名本质上就是函数的内存地址
  2. 1.可以被引用
  3. 2.可以被当作容器类型的元素
  4. 3.可以当作函数的参数和返回值
  5. """
  6.  
  7. def f1():
  8. return ''
  9.  
  10. f = f1()
  11. print(f)
  12.  
  13. def f2():
  14. return ''
  15.  
  16. def f3():
  17. return ['a', 'b']
  18.  
  19. li = [f1(), f2(), f3()]
  20. a = li[2]
  21. print(a)
  22.  
  23. dict1 = {'f1': f1, 'f2': f2, 'f3': f3}
  24. b = dict1['f1'] # <function f1 at 0x0000000001420378>
  25. c = dict1['f1']() #
  26. print(b, c)
  27.  
  28. dict1 = {'f1': f1(), 'f2': f2(), 'f3': f3()}
  29. d = dict1['f1'] #
  30. print(d)
  31. print('---------------')
  32.  
  33. def f5():
  34. return f1()
  35. a = f5()
  36. print(a) #

8.闭包

内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数

  1. def func():
  2. name = 'eva'
  3. def inner():
  4. print(name)
  1. """
  2. 想要拿到函数内部的变量和函数,返回变量跟函数
  3. 闭包函数用途
  4. 在函数外部调用函数内部的函数
  5. """
  6.  
  7. def func():
  8. name = 'zhangsan'
  9.  
  10. def inner():
  11. print(name)
  12.  
  13. return inner
  14.  
  15. f = func()
  16. f()

判断是否是闭包函数方法__closure__

  1. # 输出的__closure__有cell元素 :是闭包函数
  2. def f1():
  3. name = 'zhangsan'
  4.  
  5. def inner():
  6. print(name)
  7.  
  8. print(inner.__closure__) # (<cell at 0x0000000000E591C8: str object at 0x00000000008F37B0>,)
  9. return inner
  10.  
  11. f = f1()
  12. f()
  13.  
  14. # 输出的__closure__为None :不是闭包函数
  15. name = 'zhangsan'
  16.  
  17. def f2():
  18. def inner():
  19. print(name)
  20.  
  21. print(inner.__closure__) # 判断inner函数是不是闭包函数 None
  22. return inner
  23.  
  24. f2 = f2()
  25. f2()
  1. def f1():
  2. money = 1000
  3. def f2():
  4. name = 'zhangsan'
  5. def f3():
  6. print(name,money)
  7. return f3
  8. return f2
  9.  
  10. f = f1()
  11. i = f()
  12. i()

python基础篇_003_函数的更多相关文章

  1. python 基础篇 11 函数进阶----装饰器

    11. 前⽅⾼能-装饰器初识本节主要内容:1. 函数名的运⽤, 第⼀类对象2. 闭包3. 装饰器初识 一:函数名的运用: 函数名是一个变量,但他是一个特殊变量,加上括号可以执行函数. ⼆. 闭包什么是 ...

  2. Python基础篇(初始函数)

    Python初始函数: 一.什么是函数 1.我们到目前为止, 已经可以完成一些软件的基础功能了. 那么我们来完成这样一个功 能: 约x: print("拿出手机") print(& ...

  3. python 基础篇 匿名函数

    匿名函数基础 首先,什么是匿名函数呢?以下是匿名函数的格式: lambda argument1, argument2,... argumentN : expression 我们可以看到,匿名函数的关键 ...

  4. python 基础篇 自定义函数

    多态 我们可以看到,Python 不用考虑输入的数据类型,而是将其交给具体的代码去判断执行,同样的一个函数(比如这边的相加函数 my_sum()),可以同时应用在整型.列表.字符串等等的操作中. 在编 ...

  5. python 基础篇 10 函数进阶

    本节主要内容:1. 函数参数--动态传参2. 名称空间, 局部名称空间, 全局名称空间, 作⽤域, 加载顺序.3. 函数的嵌套4. gloabal, nonlocal关键字 ⼀. 函数参数--动态传参 ...

  6. python 基础篇 09 函数初识

    <<<<<<<<<<<<<<<------------------------------函         ...

  7. Python基础篇(三)_函数及代码复用

    Python基础篇_函数及代码复用 函数的定义.使用: 函数的定义:通过保留字def实现. 定义形式:def <函数名>(<参数列表>): <函数体> return ...

  8. python基础篇之进阶

    python基础篇之进阶 参考博客:http://www.cnblogs.com/wupeiqi/articles/5115190.html python种类 1. cpython  使用c解释器生产 ...

  9. python基础篇(六)

    PYTHON基础篇(六) 正则模块re A:正则表达式和re模块案例 B:re模块的内置方法 时间模块time A:时间模块的三种表示方式 B:时间模块的相互转换 随机数模块random A:随机数模 ...

随机推荐

  1. BATCH+VBS脚本自动执行命令

    打开cmd,然后执行run.bat s 1就会执行tmpsw.vbs的内容,1是作为id传进去的参数. run.bat: @echo off set type=%1 set id=%2 :打开一个te ...

  2. Python中的string和bytes的转换

    总的来说,bytes和string的关系是: \(bytes\xrightarrow{decode}string\) \(bytes\xleftarrow{encode}string\) 常见的几种编 ...

  3. <数据结构基础学习>(四)链表 Part 2

    一.使用链表实现栈 增,删,查只对链表头进行操作,时间复杂度都为O(1) 链表头作为栈顶 LinkedListStack<E> implements Stack<E> publ ...

  4. ant在windows及linux环境下安装

    ant下载 http://ant.apache.org/ https://ant.apache.org/bindownload.cgi 历史版本 ant在windows下安装 解压到D盘 新建系统变量 ...

  5. os.listdir()、os.walk()和os.mkdir()的用法

    内容主要参照博客https://blog.csdn.net/xxn_723911/article/details/78795033 http://www.runoob.com/python/os-wa ...

  6. 使用vue-cli创建vue项目

    vue-cli是官方发布的vue.js项目脚手架工具,使用它可以快速创建vue项目,github地址:https://github.com/vuejs/vue-cli 1.安装vue-cli //设置 ...

  7. 微服务之服务中心—Eureka

    Eureka 简介Eureka 是 Spring Cloud Netflix 的一个子模块,也是核心模块之一,用于云端服务发现,是一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故 ...

  8. DirectX11 With Windows SDK--13 动手实现一个简易Effects框架、阴影效果绘制

    前言 到现在为止,所有的教程项目都没有使用Effects11框架类来管理资源.因为在D3DCompile API (#47)版本中,如果你尝试编译fx_5_0的效果文件,会收到这样的警告: X4717 ...

  9. 点评cat系列-服务器开发环境部署

    我们有三种部署方式:1. docker 部署2. 采用官方的 war 包部署. 3. 源码部署 很显然 docker 部署是最简单的, 我尝试了多次, 都在 cat docker 容器镜像的编译过程失 ...

  10. 校园wifi

    我校师生访问本校校园WiFi(SSID为UESTC-WiFi),不受任何影响,用户名和密码均不变,可使用本校帐号加后缀@uestc.edu.cn,登录并免费使用eduroam联盟机构的WiFi(SSI ...