Python学习-函数

函数

  定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可

  特性:

          1.减少代码重复

          2.使程序有可扩展性

          3.使程序变得统一

  语法:

def 函数名():
    函数体

函数名() #调用函数

#可以有参数

def add(a,b): #带参数
  c = a + b
  print(c)
add(1,2)

 函数参数:

     1.形参:变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量

     2.实参:可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值

1 def add(a,b):  #形参
2     c = a + b
3     return c
4 
5 sum = add(1,2) #实参
6 print(sum)

    默认参数
         先看以下代码

1 def person_info(name,age,sex):
2     print('姓名:',name)
3     print('年龄:',age)
4     print('性别:',sex)
5 person_info('张一',20,'')
6 person_info('张二',22,'')
7 person_info('张三',18,'')

上面代码的sex参数传入的值都是 男,我们可以通过默认参数来实现,把sex变成默认参数

1 def person_info(name,age,sex = '')

如果调用函数时,sex参数不指定,就会默认为男,如果想要修改的话,可以指定值

1 def person_info(name,age,sex=''):
2     print('姓名:', name)
3     print('年龄:', age)
4     print('性别:', sex)
5 
6 person_info('张一',20)
7 person_info('张二',22)
8 person_info('张三',18,'')

同时需要注意的是:sex变成默认参数后要放在最后面,放在位置参数后面。
否则会产生   SyntaxError: non-default argument follows default argument 错误

 

 关键参数

   正常情况下,给函数传参数要按顺序,不想按顺序就可以用关键参数,只需指定参数名即可,但记住一个要求就是,关键参数必须放在位置参数之后。

1 person_info(name='张三',sex = '',age = 18)

非定长参数

   函数在定义时不确定用户想传入多少个参数,就可以使用非定长参数

  如果我们想实现多个数相加的功能

1 def add(*args):  #*args会把传入的参数转成一个元组形式
2     print(args)     # (1,2,4)
3     num = 0
4     for i in args:
5         num += i
6     print(num)
7 
8 add(1,2,4)
9 add(1,2,3,4,5)

当要输入多个具有名字的变量时,可以使用**kwargs

1 def person_info(**kwargs): #**kwargs 将输入的参数转换成字典
2     for i in kwargs:
3         print('%s:%s' % (i, kwargs[i]))  #name:abc
4                                                        #age:18
5     print(kwargs)    #{'name': 'abc', 'age': 18}
6 
7 person_info(name='abc',age=18)

 

 

    局部变量

1 a = 10   # 全局变量
2 
3 def foo():
4     a = 5   #局部变量
5     print(a)
6 
7 foo()
8     

      输出  5

      在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
      全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
      当全局变量与局部变量同名时,在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
 
 

 返回值

     return 语句可以得到程序的执行结果

1 def f():
2     a = 10
3     return a
4 print(f())

     函数在执行过程中只要遇到return语句,就会停止执行并返回结果,return 语句代表着函数的结束

     如果未在函数中指定return,那这个函数就会有一个默认返回值None 

 

 

  递归函数

    在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

1 def factorial(n):
2     if n <= 0:
3         return 1
4     return n * factorial(n - 1)
5 
6 print(factorial(4))

输出第n个斐波那契数列

def fibo(n):  
    if n == 1:
        return 0
    if n == 2:
        return 1
    return fibo(n - 1) + fibo(n - 2)
            
print(fibo(4))

 

     递归特性:

        1. 必须有一个明确的结束条件

        2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

        3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回     栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

 

  高阶函数

    变量可以指向函数,函数可以接收参数。 使用一个函数可以接收另一个函数作为参数,这种函数就称之为高阶函数。

1 def add(a):
2     return a
3 
4 def foo(x,y,func):
5     return func(x) + func(y)
6 
7 print(foo(1,2,add))

    map()函数

    map()函数接收两个参数,第一个是函数参数,第二个是一个可迭代的序列,map()函数将传入的函数作用到序列的每个元素,并把结果作为新的可跌代的序列返回。

    比如有一个函数是返回传入数的平方,要把函数作用到 list = [1,2,3,4,5,6,7,8,9]上,可以用map()函数实现

1 def f(n):
2     return n * n
3 li = [1,2,3,4,5,6]
4 a = map(f, li)
5 print(list(a))  #[1,4,9,16,25,36]

   map()作为高阶函数,事实上把运算规则抽象了,因此用map()函数不仅可以计算简单的平方运算,还可以计算任意更复杂的函数。

 

   reduce()函数

   reduce把一个函数作用在一个数列上[x1,x2,x3,x4,x5],这个函数必须接收两个参数,reduce把结果和序列的下一个元素做累积计算。

  比如对一个数列求和

1 from functools import reduce
2 def add(x, y):
3     return x + y
4 
5 print(reduce(add,[1,2,3,4,5,6]))

 


  filter()函数

  filter()用于过滤序列。filter()接收一个函数和一个序列,把传入的函数依次作用于每个元素,根据返回值是True 还是Flase决定保留还是舍弃该元素。

 比如要删掉数列中的偶数

1 def is_odd(n):
2     return n % 2 == 1
3 print(list(filter(is_odd,[1,2,3,4,5,6,7,8,9])))


匿名函数

  当我们在传入函数时,有时候不需要显式的定义函数,直接传入匿名函数更方便。

  map函数计算数列平方时可以传入匿名函数

print(list(map(lambda x : x * x,[1,2,3,4])))

lambda表示匿名函数,x表示函数参数。不用写return,表达式的结果就是返回值。

用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数,同样也可以把匿名函数作为返回值返回。

 

 

   

 

 

 

 

 

posted on 2018-01-21 13:53  elif_syh  阅读(358)  评论(0)    收藏  举报

导航