楼外青楼

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1. 函数基础概念

 


 

  1.1 定义: 实现具体功能的一段代码

  1.2 格式 : def 函数名(形参):

  1.3 作用 : 提高代码复用性,减少重复

  1.4 调用 : 函数名() 定义是不会执行,调用时开始执行,执行完成后回到调用行

  1.5 文档说明 : 定义函数下一行三引号之间的内容.可使用help(函数名)查看

  1.6 获取函数名 : 函数名.__name__

 

 

 

2. 局部变量与全局变量

 


 

  2.1 内置命名空间 : python解释器一启动就可以使用的名字存储在内置空间中,在启动python解释器时就加载到内存.如print(),input()等等

  2.2 局部变量:

    a. 定义:在函数内部定义的变量

    b. 特点: 只能在函数内部使用,不能在函数外使用

  2.3 全局变量:

    a.定义: 在函数外定义的变量

    b. 特点: 可以在不同的函数内部使用,或在函数外部使用

  2.4. 修改全局变量:

    a. 使用关键字global声明

    b. global关键字本质上是要修改全局变量的内存地址

      01: 对于可变类型的数据来说,可在原有内存地址上修改,可以不加global

      02: 对于不可变类型的数据来说,无法在原有内存地址上修改,修改时会改变内存地址,必须加global

      03: 对于全局变量,无论可变或不可变类型,只要是重新赋值,都需加上global

 

num2 = 1  # 定义一个全局变量

def func1():
num = 1 # 定义一个局部变量 global num2 # 修改全局变量 num2 = 2 return num def func2(): num = func1() print(num2) print('func2', num) func2()

 

 

 

  2.5 多个函数共享数据的方法

     a. 全局变量: 可在不同函数中使用

     b. 函数中使用return返回值

 

 

 

3. 函数返回值

 


 

 

 3.1 没有返回值(默认返回None)

    a. 不写return : 函数内部的代码执行完毕自动结束

    b. 只写return : 结束一个函数

    c. return None

 3.2 返回一个值 : 函数结束了且返回一个值

    3.3. 返回多个值

     a. 可以把多个值放到一个列表,元组,字典中通过return一起返回

     b. 使用一个值接收时返回一个列表,也可使用多个变量接收

 

def return1():
    return {'hello': 2, 'world': 3}

a, b = return1()
print(a, b)

 

 

 

 3.3 函数返回值特点:

      a. 函数中如果使用return返回值时 ,只能返回一个结果,函数就结束了

      b. 当函数含有返回值,调用时会返回一个结果,可使用变量保存

    c. 如果函数没有返回值,我们使用变量接收时会返回一个None

    d. 当函数执行到return时,函数会结束,后续代码不再执行

 3.4 有没有参数看小括号里面,有没有返回值看return

 

 

 

4. enumerate的使用

 


 

  4.1 作用: 在遍历的时候获取下标

  4.2 使用方法:

 

for index, value in enumerate():
          print(index, value)

 

 

 

5. 函数的嵌套

 


 

  5.1 定义: 在函数中嵌套一个函数

  5.2 闭包 : 内部函数调用外部函数的变量

 

def outer():
    a = 1
    def inner():
        print(a)
    return inner

inn = outer()
inn()

 

 

 

6. 函数的参数

 


 

  6.1 调用函数传参的方法

    a. 按照位置参数传参 :强调传入参数的位置与定义函数时的形参位置保持一致,参数数量一致

    b. 按照关键字参数传参:强调关键字的名字与函数定义时形参的名字保持一致,不要求位置

    c. 前面使用位置方式,后面使用关键字方式传参,位置参数在前,关键字参数在后,如果前面使用关键字参数,后面也只能使用关键字参数

  6.2 缺省参数

    a. 定义: 形参设置了默认值

    b. 特点: 如果给缺省参数传值了,那么就使用传入的值,否则就使用默认的值

    c. 普通参数结合缺省参数的使用:缺省参数后面可以再有缺省参数,不能有普通参数

 

def sum_num(num1, num2=10):
    sum = num1 + num2
    return sum

 

  6.3 不定长参数

    a. 定义: 不确定参数的个数

    b. 分类:

      01. 不定长位置参数(*args) : 当调用函数的时候,所有位置参数都会传给args,然后把args封装成一个元组

      02. 不定长关键字参数(**kwargs) : 当调用函数的时候,所有的关键字参数都会穿给kwargs然后封装成一个字典

  6.4 传参方法:

    a. 调用函数的时候按照位置参数的方式传参

    b. 不定长参数,结合缺省参数使用

      01. 缺省参数需放到不定长位置参数(*args)的后面

      02. 不定长关键字参数(**kwargs)需放在最后面

    c. 顺序: (name, *args, sex='nan', **kwargs)

 

def show_name(*args, **kwargs):
    print(args)
    for i in args:
        print(i, end='  ')
    print('')
    print(kwargs)
    for j in kwargs.values():
        print(j, end='  ')

show_name(23, 45, 'fd', name='lisi', age='25')

  

  6.5 拆包

    a. 对元组进行拆包(*my_tuple),表示把元组里的每一个元素按照位置参数的方法传参

    b. 对字典进行拆包{**my_dict},表示把子字典里的每一个键值对按照关键字参数进行传参

    c. 对元组和字典进行拆包(*my_tuple){**my_dict}不能单独使用,只能结合带有不定长参数的函数使用

 

def tast1(*args, **kwargs):
    print('test1', args, kwargs)


def tast2(*args, **kwargs):
    print('tast2', args, kwargs)
    tast1(*args, **kwargs)

tast2('hello', True, name='scy', age=16)

  

 

 

7. 可变于不可变类型

 


 

  7.1 可变类型: 可在原有内存空间的基础上修改数据(增/删/改),修改后数据内存地址不发生改变.列表,字典,集合

    a. 修改保存的数据的方式:

      01. 在原有内存空间的基础上修改

      02. 通过重新赋值修改,内存地址会发生变化

  7.2 不可变类型 : 不允许在原有内存地址的基础上修改数据,通过重新赋值修改后内存地址会发生变化,元组,字符串.数字

    a. 想要修改保存的数据,可通过重新赋值来完成

 

my_list = [1, 2]
print(my_list, id(my_list), hex(id(my_list)))
my_list.append(3)
print(my_list, id(my_list), hex(id(my_list)))
my_list = [1, 2, 3]
print(my_list, id(my_list), hex(id(my_list)))

 

 

 

8. 引用与引用传递

 


 

  8.1 引用

    a. 定义: 程序中数据在内存中的一个地址,简称内存地址

    b. 程序中所有的数据都保存在内存中,变量保存其实就是保存内存中的一个地址,后续根据地址在内存中获取数据

    c. 数据在内存中以十六定制的类型保存,函数id获取的内存地址为十进制,可通过hex()将其转换为十六进制

  8.2 引用传递

    a. 在python里面,所有赋值操作都是引用传递,赋值的是一个内存地址

    b. 函数传参也是按照引用进行传递的

    c. += :本意为在原有内存地址的基础上修改数据,如果数据类型不可变,则系统会重新开辟一块内存空间存储结果,数据的内存地址也将改变

    d. = : 表示赋值操作,无论是可变或不可变类型,数据的内存地址都会改变

 

 

 

   9. 递归函数

 


 

  9.1 定义: 在函数内部调用自己

  9.2 递归函数必须要有递归结束的条件,否则会出现无限循环,程序奔溃

  9.3 获取默认的递归次数: sys.getresursionlimit()

  9.4 更改默认的递归次数: sys.setresursionlimit(num)

  9.5 写递归的方式

    a. 写出临界条件

    b. 找出这一次和上一次的关系

    c. 假设当前函数已能用,调用自身计算上一次的结果,再求出本次的结果

 

 

 

10. 匿名函数

 


 

  10.1. 定义 : 没有名字的函数可以称为匿名函数,或者使用lambda关键字定义的函数

  10.2. 特点 :

    a. 匿名函数可以简化代码

    b. 匿名函数只能写一行代码

    c. 匿名函数结果不需要return关键字返回

  10.3. 格式: lambda 形参1,形参2: 匿名函数代码实现

 

sum = lambda a, b: a * b
result = sum(2, 5)
print(result)

 

 

 

  10.4. 匿名函数只能实现简单的功能操作,不能实现复杂的比如 循环 if

  10.5. 在python里面可以使用一个变量保存一个函数

  10.6. 应用: 匿名函数可以作为参数传递给另一个函数,此时不需要加小括号

 

def calc_num(func):
    num1 = 1
    num2 = 2
    result = func(1, 2)
    return result

result = calc_num(lambda num1, num2: num1 * num2)
print(result)

 

 

 

11. 高阶函数

 


 

  11.1 定义: 函数的参数是一个函数类型(常结合匿名函数使用)或函数的返回值是一个函数类型

  11.2. 当想调用函数内部的函数时,需在外部函数将内部函数返回,返回值是一个函数,可以用一个变量接收,此时该变量就是一个函数,调用时使用变量名()即可

  11.3 内置高阶函数,使用前需导入functools模块

    a. functools.reduce(函数名, 容器名) : 根据函数的功能,对容器内的数据进行计算

     注意点 : reduce接收的函数类型必须要有两个参数

 

import functools

my_list = [1, 4, 67, 34]
def sum_num(num1, num2):
    return num1 + num2
result = functools.reduce(sum_num, my_list)
#
result = functools.reduce(lambda num1, num2: num1 + num2, my_list) 使用匿名函数
print(result)

 

 

 

    b. filter(函数名, 容器名) :根据函数内功能对容器内数据进行筛选,获取数据时需将结果转换为列表

     filter :遍历容器内的每一个数据,把每一个数据交给指定的函数进行比较,判断是否传入数据

 

my_dict = [{'name': 'scy', 'age': 18}, {'name': 'yjj', 'age': 15}]
result = filter(lambda dict: dict['age'] > 15, my_dict)
print(list(result))

 

 

 

posted on 2019-05-16 10:35  楼外青楼  阅读(115)  评论(0编辑  收藏  举报