函数一

初始函数

s = ‘好好学习’
def my_len():    #定义函数(声明函数)
    i = 0
    for k in s:  #中间部分只有函数调用时才会执行
        i += 1
    print(i)
my_len()         #调用函数

此函数的特点:定义了之后可以在任何需要它的地方调用;没有返回值,只是单纯的打印
自定义函数:

def my_len():
    i = 0
    for k in s:
        i += 1
    return i       #返回值
length = my_len()  #函数调用

返回值的三种情况
返回一个值:可以返回任何数据类型,只要返回就可以接收到
返回多个值:多个返回值用多个变量接收,有几个值就用几个变量;用一个变量接收得到的是一个元组。
没有返回值:①不写return
                ②只写return:结束一个函数的继续
                      ③return None
如果再一个程序中有多个return,则只执行第一个。
形参和实参:

def my_len(s):        #自定义函数,接收参数;形参
    i = 0
    for k in s:
        i += 1
    return i
ret = my_len(s)        #参数传递;实参
或者 ret = my_len('加油')  #把‘加油’传给def  my_len(s)中的s
print(ret)

参数:①没有参数(定义函数和调用函数时括号里都不写内容)
            ②有一个参数(传什么就是什么)
            ③有多个参数:  

    站在实参的角度上:

            ①按位置传参数(按位置传递1—>a  2-->b)
               ②按关键字传参(如:ret = my_len(b=1,a=2)
            ③混着用可以但是必须先按照位置传参,再按照关键字,不能给同一个变量传多个值
             站在形参的角度上:

                         ①位置参数(必须传而且有几个参数传几个值)
                         ②默认值参数:可以不传,如果不传就默认,传了就用传的
只有调用函数时

①按位置传:直接写参数的值
②按关键字传:关键字 = 值
定义函数时

①位置参数:直接定义参数
②默认参数(关键字):参数名 = 默认值
③顺序:必须先定义位置参数,再*args,再定义默认参数,最后**kwargs
④动态参数:有多少个参数都可以;

  def sum(*args):
      n = 0
      for i in args:
          n += i
      return n
  print(sum(1,2))       #结果:3
  print(sum(1,2,3,4))    #结果:10

动态参数
*args:可以接收按照位置传参的值,组成一个元组,但不能接收关键字参数。
**kwargs:可以接收多个咱找关键字传来的参数,组成一个字典(*args必须再**kwargs之前)

def func(**kwargs):
    print(kwargs)
func(a=1,b=2,c=3)
func(a=1,b=2)
func(a=1)
#结果:{'a':1,'b':2,'c':3}
      {'a':1,'b':2}
      {'a':1}

动态参数的另一种传参方式:
站在实参的角度上:给一个序列(列表,元组)加上*,就是将这个序列按顺序打散
站在形参的角度上:给变量加上*就是组合所有传来的值

 def func(*args);
      print(args)
      li = [1,2,3,4]
 func(*li)
 #结果:(1,2,3,4)

函数的注释:

def func():
    '''
    参数1:
    参数2:
    :return:返回值时啥
    '''
    pass
原文地址:https://www.cnblogs.com/twinkle-/p/10488460.html