zoukankan      html  css  js  c++  java
  • Python——函数

    一、什么是函数

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

    函数的作用:

    • 减少重复代码,提高应用的模块性
    • 保持代码的一致性
    • 增删改代码一次搞定,简单粗暴,更易扩展  

    一、创建函数

    1、定义一个函数的规则

    • 函数代码块以def关键字开头,后接函数标识符名称和()
    • 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数
    • 函数的第一行语句可以选择性地使用文档字符串——用于存放函数说明
    • 函数内容以冒号起始,并且缩进
    • return[表达式]结束函数,选择性返回一个值给调用方。如果没有return,则相当于返回None

    语法:

    1 def 函数名 (参数列表)
    2     函数体

    2、形参和实参

     形参:虚拟变量,在定义函数和函数体的时候使用形参。目的是在函数调用时接收实参,实参个数、类型要与形参一一对应。

     实参:调用函数时传给函数的参数。可以是常量、变量、表达式、函数。

    形参不占用内存空间,形参变量只有在被调用时才分配内存单元。

     1 import time
     2 def action1(n):
     3     print('Start action 1.')
     4     logger(n)
     5 def action2(n):
     6     print('Start action 2.')
     7     logger(n)
     8 def action3(n):
     9     print('Start action 3.')
    10     logger(n)
    11 def logger(n):
    12     time_format = '%Y-%m-%d %X'
    13     time_current = time.strftime(time_format)
    14     with open('日志记录','a') as f:
    15         f.write("%s End action %s.
    "%(time_current,n))
    16 action1(10)
    17 action2(20)
    18 action3(30)

    3、函数的参数

    • 必需参数
    • 关键字参数
    • 默认参数
    • 不定长参数
    1. 无命名参数
    2. 有命名参数

     必需参数

    必需参数在调用和声明时的数量及顺序必须保持一致。

    关键字参数

    函数调用时使用关键字参数来确定传入的参数值,按照参数名匹配参数值,使用关键在参数允许含在在调用时参数的顺序与声明时不一致。

    默认参数

    定义函数时,设定默认参数。当调用函数时,缺省参数如果没有值传入,则使用默认参数设定的值。

    1 def print_info(name,age,sex='male'):
    2  
    3     print('Name:%s'%name)
    4     print('age:%s'%age)
    5     print('Sex:%s'%sex)
    6     return
    7  
    8 print_info('alex',18)
    9 print_info('铁锤',40,'female')

    不定长参数

    例1:

    1 def add(*args):
    2     print('args:',args)
    3     sum = 0
    4     for i in args:
    5         sum += i
    6     return sum
    7 print('sum:',add(1,2,3,4,5))

    输出:

    args: (1, 2, 3, 4, 5)
    sum: 15

    例2:

    1 def print_info(**kwargs):
    2     print('kwargs:',kwargs)
    3     sum = 0
    4     for i in kwargs:
    5         print('%s:%s' % (i, kwargs[i]))
    6 
    7 print_info(name='oliver',age=20,sex='female')

    输出:

    kwargs: {'name': 'oliver', 'age': 20, 'sex': 'female'}
    name:oliver
    age:20
    sex:female
    *args用元组接收传入的参数,**kwargs用字典接收传入的键值对。

    4、return

    return的作用:

    (1)结束函数

    (2)返回某个对象

    注意点:

    如果不加return,默认返回None。

    如果return有个对象,那么会将多个对象封装成一个元组。

    遇到return语句,就会停止执行并返回结果。

    5、函数的作用域

     L:local,局部作用域

     E:enclosing,函数嵌套作用域

     G:global,全局作用域

     B:built_in,python内置作用域

    查找顺序:L→E→G→B

    global关键字:

     例:(将local作用域中的变量声明为global作用域)

    1 count = 10
    2 def outer():
    3     global count    #打印前需先定义count的作用域
    4     print(count)  #local variable 'count' referenced before assignment
    5     count = 100
    6     print(count)
    7 outer()

    nonlocal关键字:

    例:(将local作用域中的变量声明为enclosing作用域)

    1 def outer():
    2     count = 10
    3     def inner():
    4         nonlocal count  #先声明为enclosing作用域
    5         count = 20
    6         print(count)
    7     inner()
    8     print(count)
    9 outer()

    在局部作用域,不能修改全局作用域的变量。

    在Python中,只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如if、try、for等)是不会引入新的作用域的

    6、高阶函数

    将函数名作为实参传给另一个函数使用。

    1 def f(n):
    2     return n*n
    3 def foo(a,b,func):
    4     return func(a)+func(b)
    5 print(foo(1,2,f))

    输出: 5

    函数不仅可以赋值,也可以作为函数的参数,还可以作为函数的返回值。

    7、递归函数

     用递归函数实现打印斐波那契数列:0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181

    前两项分别为:0和1,从第三项开始每一项是前两项之和,因此可得:f(n) = f(n-1) + f(n-2)

    1 def fibo(n):
    2     if n <= 2:
    3         return n - 1
    4     return fibo(n-1)+fibo(n-2)
    5 
    6 print(fibo(8))

    输出: 13

    递归函数特性:

    • 调用自身函数
    • 有一个结束条件

    需要注意的是,凡是能用递归解决的问题,通过循环都可以解决,并且递归的效率比较低,一般只能递归998次,超出会报错。

    8、内置函数

     eval()

    eval()函数不仅可以将字符串转换为字典,还可以作为计算机使用。

    1 print(eval('1+3/8*9'))

    输出: 4.375

    下面是几个非常重要的内置函数:

    filter(function, sequence)

    1 str = ['a', 'b', 'c', 'd']
    2 def fun1(s):
    3     if s != 'a':
    4         return s
    5 ret = filter(fun1, str)
    6 print(list(ret))  # ret是一个迭代器对象

    输出: ['b', 'c', 'd']

    map(function, sequence)

    1 str = ['hello', 'a', 'b']
    2 def fun2(s):
    3     return s + "alvin"
    4 ret = map(fun2, str)
    5 print(ret)  # map object的迭代器
    6 print(list(ret))

    输出:

    <map object at 0x7f382ca0aba8>
    ['helloalvin', 'aalvin', 'balvin']

    reduce(function, sequence, starting_value)

    1 from functools import reduce
    2 def add1(x, y):
    3     return x + y
    4 print(reduce(add1, range(1, 101)))  ## 4950 (注:1+2+...+99)
    5 
    6 print(reduce(add1, range(1, 101), 20))  ## 4970 (注:1+2+...+99+20)

    输出:

    5050
    5070

    lambda

    1 def add(a,b):
    2     return a + b
    3  
    4 print add(2,3)
    5  
    6   
    7 #匿名函数
    8 add = lambda a,b : a + b
    9 print add(2,3)
  • 相关阅读:
    测试用例练习2
    测试小尝试
    两个栈实现队列 Python实现
    treap Python实现
    AVL树Python实现(使用递推实现添加与删除)
    AVL树Python实现
    跳表(skiplist)Python实现
    红黑树Python实现
    Django Middleware 之 SessionMiddleware
    软件测试——Peer Review(简介)
  • 原文地址:https://www.cnblogs.com/pyramid1001/p/5844861.html
Copyright © 2011-2022 走看看