python函数1(基础)

函数

       函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

       函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。

 
一、函数定义
       1、对于自定义函数,需要遵守以下几个规则:
  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()

  • 圆括号内可以用于定义参数,圆括号外紧跟冒号

  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明

  • 函数内容(函数体)缩进(一般是四个空格键或一个Tab键)

  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None

       2、语法

def 函数名(参数):     #定义函数(声明),参数是形参
    '''
    说明文档
    '''
    函数体
    return 表达式       #返回值
    
函数名(参数)        #调用函数,参数是实参

  函数声明时,括号里的参数称为形参,形参的值是不确定的,只是用来占位的。

       函数调用时传递参数,函数调用时传入的参数,才是真正参与运算的数据,我们称为实参。

       函数调用时,会把实参一一对应交给形参处理(位置传参),但也可以关键字传参,就不讲究位置了。

       函数的返回值就是函数的执行结果,并不是所有函数都有返回值。

       3、函数定义的几个建议

       为了更好的阅读函数,程序员在进行函数定义时,时常对函数建议和说明:

       a、对形参建议类型

       b、对返回值建议类型

       c、说明文档

def add(x: int, y: int) -> float:  #参数x,y建议int,返回值建议float
    '''                            #函数说明
    函数add为加法运算
    :param x:第一个加数
    :param y:第二个加数
    :return:返回和
    '''
    return x + y / 2


print(add(3, 4))
#5.0

  注意:这里只是建议,如果类型不符合,只要符合语法规则,也不执行,不会报错。

def add(x: int, y: int) -> float:
    
    return x + y


print(add('3', '4'))
# '34'

  

 二、关于函数名

       虽然普通的标识符都能作为函数名,但为了便于阅读,一般函数名使用下划线”_“连接所有的单词,比如all_student

 三、关于参数

      1、默认参数

       如果传递了参数,就使用传递的参数;如果没有传递参数,就使用默认的值。
def func(x,y,z='Jack'):
    pass
func(4,5,'Rose')      #传递了参数

func(4,5)      #缺省了一个参数z,就使用默认'Jack'

func('hello','world')     #位置传参:x='hello',y='world',z='Jack'

func(y=5,x=4)    #关键字传参,参数位置可以变化

func(5,z='Mike',y=4)  #既有位置传参,又有关键字传参,位置参数一定放在前面

  

       2、可变参数

       可变参数有两种形式,带*号的和带**号的。带*号的变量变成存放多余实参的元祖;带**号的变量变成存放关键字实参的字典。

#def func(*args)     可变位置参数,参数以元组的形式存在args里
def add(x,y,*args):
    sum=x+y
    for arg in args:
        sum+=arg
    return sum
    print(add(1,3))      #arg=()
    print(add(1,3,5,7))   #arg=(5,7)
    
#def func(**kwargs)    可变关键字参数,参数以字典的形式存在kwargs里
def multi(**kwargs):
    c=1
    for m in kwargs.values():
        c*=m
    print(c)
multi(x=2,y=3,z=4)

 def func(*args,**kwargs):   #组合使用
     pass    #arg=(1,3,5)  kwargs={'a':'hello','b':'world'}
 func(1,3,5,a='hello',b='world')    

  

       3、参数传递方式

       python中,根据实际参数的类型不同,函数参数的传递方式可分为 2 种,分别为值传递和引用(地址)传递:

       a、值传递:适用于实参类型为不可变类型(字符串、数字、元组);

       b、引用(地址)传递:适用于实参类型为可变类型(列表,字典);


       值传递和引用传递的区别是,函数参数进行值传递后,若形参的值发生改变,不会影响实参的值;而函数参数继续引用传递后,改变形参的值,实参的值也会一同改变。

def func(a):    
    a = 10
b = 2
func(b)    #实参b是不可变数据类型
print(b) # 结果是 2

def func(mylist):
     mylist.append([1,2,3,4])
     print ("函数内取值: ", mylist)
     return
 
mylist = [10,20,30]
func(mylist)    #实参mylist是可变数据类型
print("函数外取值:",mylist)
#运行结果: 函数内取值:  [10, 20, 30, [1, 2, 3, 4]]
#          函数外取值:  [10, 20, 30, [1, 2, 3, 4]]

  

       4、函数返回值

        一般情况下,一个函数最多只会执行一个return语句。

       特殊情况(finally语句)下,一个函数可能会执行多个return语句。

       一个return语句可以返回多个值:

  • return [x,y] 返回列表

  • return {‘x’:x,‘y’:y} 返回字典

  • return (x,y)或return x,y 返回元组

       

        5、函数中的变量

        函数内的变量称为局部变量,局部变量只能在函数内部使用。

        函数外的变量称为全局变量,全局变量在整个程序中都可以调用。

  • 全局变量和局部变量可以同名(函数外全局变量,函数内局部变量)

  • 函数内部要修改全局变量,在函数内声明: global 变量名

  • 对于嵌套多层的函数,使用nonlocal关键字可以将名字声明为来自外部嵌套函数定义的作用域(非全局),nonlocal x会从当前函数的外层函数开始一层层去查找名字x,若是一直到最外层函数都找不到,则会抛出异常。

  • 在函数内可以调用内置函数locals()输出所有局部变量,调用globals()输出所有全局变量

  • 在Python里,只有函数能够分割作用域

       6、函数对象

def add(x,y):
    return x+y

def foo(x,y,func):
    return func(x,y)

def bar():
    return add

func = add

print(func(2, 3))   # 函数被引用

dict={'add':add,'max':max}

print(dict['add'](4, 5))     # 函数可以作为容器类型的元素

print(foo(8, 9, add))    # 函数可以作为参数传入另外一个函数

f=bar()
print(f(-5, -4))    # 函数的返回值可以是一个函数

   

原文地址:https://www.cnblogs.com/shixiaoxun/p/14414878.html