• python学习笔记——函数


    ……

    目录:

    一;格式

    二;lambda匿名表达式

    三;位置参数和关键字参数

    四;默认值参数

    五;print()函数参数

    六;全局变量global

    ……

    python的函数和c语言的函数用法基本上差不多。

    当然,也有些微的差别。

    ……

    一;格式

    pyhon用def作为自定义函数的关键词,并且不需要像c语言那样申明返回的类型,一个def就搞定了。

    比如:

    1. def f(x,y,z):
    2.     return x+y+z
    3. print(f(1,2,3))

    会输出:

    6

    这是一个简单的三个数相加的函数,基本上自定义函数的格式就是这样。

    def相当于c语言中的申明返回类型(只不过在python中,无论返回什么类型,都是用def而已),而f相当于c语言中的函数名,而f中的x,y,z则是形参,后面的冒号是python特有的语法规则,而return和c语言一样可以返回值回到主程序。

    ……

    ……

    二;lambda匿名表达式

    lambda可以创建一个匿名函数

    有什么用呢?

    好像匿名函数还挺适合用来编写一些简单的函数的。

    比如这样:

    1. f=lambda x,y,z:x+y+z
    2. print(f(1,2,3))

    同样会输出:

    6

    这个函数和def那个函数是一样的,只不过看起来更加简洁了。匿名函数的格式基本上是lambda 形参:表达式。然后呢,匿名函数会自动返回表达式的值,比如上面这个例子,就返回了表达式的值是6。

    ……

    ……

    三;位置参数和关键字参数

    调用函数传参是一个很重要的过程,而python在这方面要比c更加灵活。

    1. def f(x,y,z):
    2.     return x+y+z
    3. print(f(1,2,3))

    上面这个函数,就是利用位置参数进行传参。f(1,2,3),其中的1对应的是函数中的x,而2对应的是函数中的y,3对应的是函数中的z。这种一一对应的关系,就是位置参数。

    但是,还有另外一种传参的方式,也就是关键字传参。

    比如这样写:

    1. def f(x,y,z):
    2.     print('x=%d,y=%d,z=%d'%(x,y,z))
    3. f(z=3,y=2,x=1)

    会输出:

    x=1,y=2,z=3

    虽然这一次输入的实参顺序和之前的不一样,但却用关键字来限定了实参所对应的形参,所以f(z=3,y=2,x=1)和f(1,2,3)其实是一样的,没什么区别。

    这就是python的相对灵活的地方。

    最后,其实位置参数和关键字参数可以混着用,但我觉得没必要,那样搞反而复杂了,所以就不多说了。

    ……

    ……

    四;默认值参数

    可以给形参指定一个默认的参数值。

    比如:

    1. def f(x,y,z=100):
    2.     return x+y+z
    3. print(f(1,2))

    会输出:

    103

    这是因为我指定了z=100,所以只需要输入x和y的值,就可以顺利的执行函数了。

    不过,只能指定最后一个或者最后几个形参。

    错误的指定默认值参数:f(x,y=100,z)或者f(x=100,y,z)

    正确的指定默认值参数:f(x,y,z=100)、f(x,y=100,z=100)。

    ……

    ……

    五;不定长数目参数

    可以用*或**来表达不定长数目参数。

    *接收的是列表,而**接收的是字典。

    比如:

    1. def f(x,*y):
    2.     print(x)
    3.     print(y)
    4. f(1,2,3)

    会输出:

    1

    (2, 3)

    可以看到,函数只有两个形参,而输入的却有三个实参。不过y前面加上了以一个*,也就是*y,这表示多余的输入都会被放入一个元祖中。就像这个例子,1被存到了x中,然后还有2和3则是被放到了y这个元祖中。

    再举一个字典的例子,比如:

    1. def f(x,**y):
    2.     print(x)
    3.     print(y)
    4. f(1,dog=1,cat=2,horse=3)

    会输出:

    1

    {'dog': 1, 'cat': 2, 'horse': 3}

    可以看到,1输入成了x,而后面的数则成为了y中的字典。

    刚开始看到的时候,我还以为是c中的指针呢,结果和指针并不是一个东西,区别来看待就好了。

    ……

    ……

    五;print()函数参数

    可以用sep和end来控制print输出的格式。

    比如这样一个函数:

    1. x,y,z=1,2,3
    2. print(x,y,z)
    3. print(x,y,z,end='\n\n')
    4. print(x,y,z,sep=',')

    会输出:

    1 2 3

    1 2 3

    1,2,3

    可以看到,第一行输出是print(x,y,z)的输出结果,其实就是正常的输出,而第二行输出则是加入了end=’\n\n’,这代表着输出结束后,要使用两个空行符号。而最后一行的输出有逗号,则是因为sep可以自定义输出的分割符。

    ……

    ……

    六;全局变量global

    全局变量是个很好用的东西,它能做到和c语言中的指针类似的功能,比如,从函数中返回多个数。(注意,不是用return返回的,而是定义了global 这个全局变量)

     比如这样一段代码:

    1. def f(a,b):
    2.     global x,y
    3.     x=x+1
    4.     y=y+1
    5.     return x+y
    6. x,y=1,2
    7. result=f(x,y)
    8. print(x,y)
    9. print(result)

    会输出:

    2 3

    5

    如果没有定义全局变量的话,那么函数中的x和y与主程序中的x,y是没有任何关系的,所以会输出1和2。但由于在函数内定义了global,所以就可以输出加1后的x和y。

    我又查了一下x和y的代码。

    用这样一段代码:

    1. def f(a,b):
    2.     global x,y
    3.     print(id(x), id(y))
    4.     x=x+1
    5.     y=y+1
    6. x,y=1,2
    7. m,n=1,2
    8. print(id(x),id(y))
    9. f(x,y)
    10. print(id(x),id(y))

    上面的代码用id()函数分别输出了地址,可以看到输出这样的结果:

    1520792332592 1520792332624

    1520792332592 1520792332624

    1520792332624 1520792332656

    会发现前面两行的地址是一样的,说明在定义了全局变量后,函数内部x和y便指向了1和2,而当x和y进行加1操作并且跳出函数后,带回了+1后的x和y,所以最后一个x和y的id才会和前面两个不一样。

    这说明,用global全局变量,可以带回在函数内部进行各种操作后的变量,有指针那味了。

  • 相关阅读:
    力扣刷题笔记——Day1
    内存Webshell马详解
    git 中如何删除 Untracked files 文件
    【广州华锐互动】VR历史古城复原:沉浸式体验古代建筑,感受千年风华!
    接口自动化之测试数据动态生成并替换
    【HIT-OSLAB-2-系统调用的实现】
    C#开发的OpenRA游戏之延时初始化Lazy<T> 类
    redis持久化之RDB (七)
    如何将本地项目上传到github上
    Zebec Protocol 成非洲利比亚展会合作伙伴,并将向第三世界国家布局
  • 原文地址:https://blog.csdn.net/oyqho/article/details/127786823