• Python初级笔记6 函数


    函数概念

    • 函数是一段具有特定功能的代码的集合。
    • 函数的目的主要在于降低编程难度与增加代码复用。
    • 一组语句等价于一个函数,,需要使用这组语句的地方直接调用函数名即可。
    • 函数的定义也叫函数的声明,定义后的函数不能直接运行需要通过调用

    函数定义 

    python使用保留字def定义函数

    def 函数名(参数):

            函数体

            return(返回值列表)

    • 函数遇见return会立即返回退出,不会执行函数内return下边的代码
    • 没有设置返回值时,默认的返回值时null
    • return只能返回一个值
    • 不需要定义参数类型,因为python是弱数据语言
    1. def print_hi():
    2. print("helo world")
    3. print_hi()

    结果:

    PS E:\学习笔记\Python> & E:/Python/python.exe e:/学习笔记/Python/3.28/函数.py
    helo world


     本地变量(局部变量)和全局变量:

    • 局部变量:

    • 声明在函数内部的变量,可以return出去,外面可以拿个变量接住
    • 形参,在函数括号中,是局部变量
    • 局部变量只能在函数内部被访问

    • 全局变量:

    • 不在函数内定义,在任何地方都可以被读取
    • 函数内部可以访问全局变量
    • 默认情况下全局变量不能被函数内更改
    • 在函数内用global就可以更改全局变量 
    1. a=0
    2. def hello():
    3. print("hello world!!")
    4. global a
    5. a+=1
    6. for i in range(0,4):
    7. hello()
    8. print(f"一共运行了{a}遍")

    • :每当一个程序被调用的时候 ,会立刻在内存中形成一个执行栈(先进后出),函数调用的时候会把堆中函数程序地址压入栈中,函数执行完毕会立刻弹栈。
    • 磁盘:存储数据的地方,cpu不可能直接从磁盘读取数据,因为读写速度慢。
    • 内存:可以理解为一个缓冲区,内存读写速度快。
    • 比如,要运行一段程序,程序在磁盘中存着,将磁盘中的程序加载到内存中向CPU提供数据
    • 函数存放到堆中,因为栈的空间有限,
    • 局部变量在被函数调用的时候会被压入栈中,函数执行完毕会出栈,失去内存地址,访问不到局部变量

    运算器+控制器=cpu
    存储器=内存+磁盘


    值传递与引用传递 

    1、值传递

    • 传递的是值
    • 将数值赋给形参,形参传回去变成局部变量,函数无法直接修改全局变量
    1. def t(a,b):
    2. a+=6
    3. b+=2
    4. x=1
    5. y=9
    6. t(x,y)
    7. print(x)
    8. print(y)

    函数外的X,Y没有改变 

    结果:

    PS E:\学习笔记\Python> & E:/Python/python.exe e:/学习笔记/Python/3.29/值传递与引用传递.py
    1
    9

    2、引用传递 

    • 传递的是内存地址
    • 列表是引用对象
    1. def k(a):
    2. a.append("zhang")
    3. list1=[1,2,3,5,"tyu"]
    4. k(list1)
    5. print(list1)

    数组在函数中被修改,是因为地址被传回去了 

    结果:

    PS E:\学习笔记\Python> & E:/Python/python.exe e:/学习笔记/Python/3.29/值传递与引用传递.py
    [1, 2, 3, 5, 'tyu', 'zhang']


    练习 

    1. def isvalid(a,b,c):
    2. if a+b>c and a+c>b and b+c>a:
    3. return 1
    4. else:
    5. print("错误")
    6. return 0
    7. def valid(a,b,c):
    8. if isvalid(a,b,c)==1:
    9. p=0.5*(a+b+c)
    10. v=(p*(p-a)*(p-b)*(p-c))**0.5
    11. print(f"三角新面积为:{v}")
    12. else:
    13. pass
    14. a,b,c=eval(input("enter three num="))
    15. valid(a,b,c)

     默认参数值

    大多情况下,该参数值不需要改变,书写位置一般在正常参数后面,方便用户调用函数

    1. def t(a,b=5):
    2. return a+b
    3. a,b=eval(input("enter the num="))
    4. k=t(a)
    5. print(k)

    结果:

    PS E:\学习笔记\Python> & E:/Python/python.exe e:/学习笔记/Python/3.29/默认参数.py
    enter the num=1,3
    6

    若指向列表:

    1. def test(num=[]):
    2. num.append("zhangsan")
    3. print(num)
    4. test()
    5. test()

     结果:

    PS E:\学习笔记\Python> & E:/Python/python.exe e:/学习笔记/Python/3.29/默认参数.py
    ['zhangsan']
    ['zhangsan', 'zhangsan']

    注意:默认参数指向不可变数据类型


    可变参数(*args)

    返回一个元组

    1. def s(a,b,*c):
    2. print(f"c={c}")
    3. sum=a+b
    4. for i in c:
    5. sum+=i
    6. return sum
    7. print(f"sum={s(1,1,2,2,3)}")

    结果:

    PS E:\学习笔记\Python> & E:/Python/python.exe e:/学习笔记/Python/3.29/可变参数.py
    c=(2, 2, 3)
    sum=9

    让第一个参数不是数组

    如果说传进去的是元组或者列表,只需要在元组或者列表前加*,就会把元组或列表作为可变参数传进去

    1. def s(*c):
    2. print(f"c={c}")
    3. a=[6,9,0]
    4. print(s(*a))
    5. print(s(a))

     结果:
    PS E:\学习笔记\Python> & E:/Python/python.exe e:/学习笔记/Python/3.29/可变参数.py
    c=(6, 9, 0)
    None
    c=([6, 9, 0],)
    None


    关键字参数 (命名参数)

    将键值对传回去

    1. def x(name,age,**kw):
    2. print(f"name={name},age是{age},其他是{kw}")
    3. # x("zhangsan",13,job="画家",hobby="sing")
    4. d={"job":"漫画家","hobby":"画画睡觉吃饭"}
    5. x("zhangsan",13,**d)

    结果:

    PS E:\学习笔记\Python> & E:/Python/python.exe e:/学习笔记/Python/3.29/关键字参数.py
    name=zhangsan,age是13,其他是{'job': '漫画家', 'hobby': '画画睡觉吃饭'} 


    函数作为参数

    1. def t():
    2. print("test1----")
    3. def t2(fn):
    4. fn()
    5. print("test2~~~")
    6. t()
    7. t2(t)

    结果:

    PS E:\学习笔记\Python> & E:/Python/python.exe e:/学习笔记/Python/3.29/函数参数.py
    test1----
    test1----
    test2~~~

    匿名函数 lambda表达式

    lambda 参数[参数]:函数 

    1. def t2(fn):
    2. fn()
    3. print("test2~~~")
    4. t2(lambda:print("佳人们谁懂"))

    结果:

    PS E:\学习笔记\Python> & E:/Python/python.exe e:/学习笔记/Python/3.29/函数参数.py
    佳人们谁懂
    test2~~~

    1. def t2(fn):
    2. print(fn(1,4))
    3. print("test2~~~")
    4. t2(lambda a,b:a+b)#自动返回,不用return

     结果:

    PS E:\学习笔记\Python> & E:/Python/python.exe e:/学习笔记/Python/3.29/函数参数.py
    5
    test2~~~

  • 相关阅读:
    JS高级:作用域与作用域链
    Spring MVC组件之HandlerMapping
    深入理解,2022最新版JDK源码笔记强势开源,基础到高级,应有尽有,太全了
    Mybatis Plus配置多个数据源
    【深度学习笔记】计算机视觉——FCN(全卷积网络
    开题报告之论文框架
    Chrome vs Firefox 性能之争,到底哪家强?
    构建AR视频空间大数据平台(物联网及工业互联网、视频、AI场景识别)
    Hyperf crontab 定时任务组件
    Mybatis第三天
  • 原文地址:https://blog.csdn.net/cycyzh/article/details/138203595