2.6 功能的封装——函数,末尾有彩蛋

版权声明:日常小迷糊 https://blog.csdn.net/m0_37701158/article/details/85330746

函数:数学中的x,y函数???python中就是功能的封装。方便使用这个工具,就像python的包一样,你会用这个包,你不用了解他的运行结构,除非你要二开。其实包就是一系列函数的整合。一句话:函数就是你封装的功能,在每次用这个函数的时候叫他名字就行了。

#定义函数
def 函数名(形参):
    功能代码块

#使用函数

函数名(传入实参)


#介绍两个概念:在定义函数中的参数叫做形式参数,简称形参,就是挖坑用的。
#实际使用的参数叫做实参,填坑用的。也就是真正的数据才会叫做实参 。稍后详细介绍。

#例子如下:

#下面的就是求ab连个数字的和的函数。a,b现在都是形参。
def sum_a_b(a,b):
    print(a+b)


#函数调用:下面的就是1,2就是实参。实参和形参还有分类稍后介绍。
sum_a_b(1,2) 

如果想要了解某个函数的功能:用help(函数名)  就行。

2,带有返回值的函数。假设刚刚的两个数字相加的函数,他的运算结果,你不想要输出打印出来。想要储存起来。只需要把print(a+b) 换成 return a+b 就行。不过在用这个函数的时候需要把结果接收下。既然想要保存,肯定要接受起来.

c =sum_a_b(1,2)

3,函数参数类型细讲:

a,无参数,无返回值的。就是那种直接打印结果的。

b,无参数,有返回值的。不调用参数,但是会返回一些数据。

c,有参数,无返回值的。刚刚上面的第一个例子。

d,有参数,有返回值的。刚刚上面修改过的例子2.

补充【超重要】:e,缺省参数【默认值参数】:就是这个形参定义了,但是这个形参默认已经有了值。如果在调用参数的时候,不给这个带有默认值的形参传入值。则会使用默认值。如果传值了,则会优先使用传入的值。

注意:带有默认值的参数一定要位于参数列表的最后面。

def printinfo( name, age = 35 ):
   # 打印任何传入的字符串
   print "Name: ", name
   print "Age ", age

# 调用printinfo函数
printinfo(name="miki" )
printinfo( age=9,name="miki" )

f:不定长参数:在不确定有几个参数时定义一个函数可以用这个。(*)会存放所有的未命名参数,类型会变成元组类型。(**)会存放所有的字典类型参数key1=value1的这种。千万记住【重点】不是因为后面的  args 字符确定类型的。而是因为 * 的个数。

【附图一张:结果和下面的图片运行结果一样】

【以前不定长参数还是一脸懵逼,现在回头仔细品味下,领悟不少。多做笔记多实践才是技巧,不要眼高手低。送给我自己。】:直接上刚刚练习的截图 。说一个格式化函数。format 。简单的使用方法就是前面挖坑,后面把数据填上就行,类似于%s 。但是这个可以格式化元组等。

4,函数的嵌套使用。

所谓嵌套呢,就是函数里面有函数。

结果:

    ---- testA start----
    ---- testB start----
    这里是testB函数执行的代码...(省略)...
    ---- testB end----
    ---- testA end----

5,局部变量和全局变量。

简单来说:函数里面定义的变量叫做局部变量。外界不能直接访问 。

全局变量:就是不在函数里面定义的,在任何位置都能访问的变量。

  • 如果在函数中修改全局变量,那么就需要使用global进行声明,否则出错
  • 如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量的,小技巧强龙不压地头蛇。或者说函数就是懒,不会舍近求远。先找最近的。

 6,可变类型的全局变量:

回想一下上一节讲过的可变引用和不可变引用的数据类型。

对于不可变类型【数值,元组类型】的全局变量,它指向的数据不能修改。所以在函数中不使用global 时无法修改全局变量、

而对于可变类型【字典,和列表】的全局变量。不用使用global也能修改全局变量。这样的性质是不是说明可变类型的变量没有全局和局部之分呢?【错了,定义在函数内部的局部变量可变类型的,外界就不能修改(特殊方法除外)】。

7,引用传参。

    考虑一下为啥打印出来的函数里的a是2,而直接输出的a还是1呢??

  • 可变类型与不可变类型的变量分别作为函数参数时,会有什么不同吗?
    def selfadd(a):
        a+=a
        print("函数中的a的值{}".format(a))
        
    
    a= 1
    
    selfadd(a)
    
    print(a)
    #列表可变类型
    
    b=[1,2]
    
    selfadd(b)
    
    print(b)
    

Python中函数参数是引用传递(注意不是值传递)。对于不可变类型,因变量不能修改,所以运算不会影响到变量自身;而对于可变类型来说,函数体中的运算有可能会更改传入的参数变量。小提示可以用:id() 查看地址哦。答案下一篇博客揭晓。

>>> def selfAdd(a):
...     """自增"""
...     a = a + a   # 我们更改了函数体的这句话
...
>>> a_int = 1
>>> a_int
1
>>> selfAdd(a_int)
>>> a_int
1
>>> a_list = [1, 2]
>>> a_list
[1, 2]
>>> selfAdd(a_list)
>>> a_list
[1, 2]      # 想一想为什么没有变呢?

猜你喜欢

转载自blog.csdn.net/m0_37701158/article/details/85330746