05 函数

函数

- 基础:定义、参数、返回值
- 进阶:
	- 默认参数如果是可变类型 : {}	[] 集合	内部元素可以被修改的类型  有坑,不建议使用
    - 作用域 
	    py:
            if 1==1:
                name = 'test'
            
            # 等于: test 没有问题
            print name 
            
            for i in range(10):
                pass
            
            #此时外面是可以使用i,此时值为: 9
            print(i) 
		java:
            if (1==1){
                String name = 'test';
                
                #可以打印,java 作用域 以 {为分界线}
                system.out.println(name); 
            }
            
            #执行会报错,不允许 
            system.out.println(name);
	- 闭包
    - 装饰器 @+嵌套的函数  -> 目的,不修改原函数内容的前提下,在函数的执行前后自定义操作
    
- 内置函数
	sum/abs/hex/int/oct/bin/chr/ord/len/rang/id(比较内存地址) ....
    open -> 文件操作  ,操作模式有: r (只读) w(只写,会将原有数据清空)  a(追加) rb	wb	ab  b 表示得到的是原始的2进制数据

- 生成器函数  (编码中不常用,源码常使用)
	- 表象:如果函数中出现了yield关键字,就是生成器函数
    - 意义: 节省内存
    	- 创建 1~100000 数字时,	-> 如果直接在内存创建,占用内容太大
        - 创建 1~100000 数字时,  ->yield使用过程中,边使用边创建
    
        # 传统函数
        def info():
            v1 = 100
            v2 = 200
            return v1, v2

        # 定义的函数不会执行,只有调用时才会执行 ,函数名后面加 () 表示调用
        ret = info()  
        print(ret)


        # 1、生成器函数
        def info():
            v1 = 100
            yield v1 + 10
            v2 = 200
            yield v2 + 10
            return v1 + v2


        # 2、执行生成器函数,就不会执行函数内部的代码,V1=100, v2=200 return 都不会执行,而是直接返回一个生成器对象
        ret = info()  #
        # 此时ret 为 generator object对象

        # 3、通过next  + 生成器对象,执行函数中的代码
        # 此时会进入函数内部,先执行v1= 100,然后执行 yield v1 +10 ,一旦执行完yield 表示当前执行已经结束了,
        # 当前执行状态进行冻结,会将后续 yield后续的内容返回
        vaule = next(ret)  
        
		# 此时vaule的值为:110
        print(vaule)  

        #在次执行next,会接着上次冻结的状态,继续往后面走,执行:    yield v2 + 10

        vaule = next(ret)
        
        # 此时vaule的值为:210
        print(vaule)   
        # 4、执行完毕后,在次执行 next(ret) ,会报错提示:stopIteration:  表示当前这个生成器执行完了
        vaule = next(ret)
        # 报错StopIteration: 300
        print(vaule)   

        # 解决:会报错提示:stopIteration 报错方法
        def info():
            v1 = 100
            yield v1 + 10
            v2 = 200
            yield v2 + 10
            return v1 + v2
        
        #ret生成器对象
        ret = info()  
        for item in ret:
            print(item)


    
posted @ 2024-09-28 07:42  jhchena  阅读(2)  评论(0编辑  收藏  举报