**递归**
        def calc(n):
            print(n)
            if int(n / 2) == 0:  条件判断
                return n
            return calc(int(n/2))
        calc(10)
        结果为10,5,2,1
        
        下一个是实现过程
            def calc(n):
                print(n)
                n = int(n/2)
                if n > 0:
                    calc(n)
                print(n)
            calc(10)
        结果为10,5,2,1,     0,1,2,5
        (实现过程中,递归进去几次就要出来几次)
        
        
    在函数内部,可以调用其他函数,如果一个函数在内部调用函数自身,
        这个函数就是递归函数。
        1,必须有一个明确 的结束条件
        2,每一次递归,问题规模都减少
        3,递归效率不高(栈溢出)
        
            a = '1 3 4 6 7 8 9 11 15 17 19 21 22 25 29 33 38 69 107'
            b = a.split()
            c = []
            for i in b:
                c.append(int(i))  #把数字字符串列表转化为数字列表
            print(c)
            # print(len(c))
            d =[x**2 for x in range(11,100)]
            print(d)
            c.extend(d)
            e = c
            print(c)
            print(e)
            # print(id(c))
            # print(id(e))

def binary_search(dataset,find_num):
                print(dataset)
                if len(dataset) > 1:    # 列表的长度
                    if find_num < dataset[-1]:
                        mid = len(dataset) // 2  # 列表长度的一半
                        if dataset[mid] == find_num:
                            print('find it', find_num)
                        elif dataset[mid] < find_num:
                            print('所找的数字在列表的后半边')
                            # dataset = dataset[mid + 1:]
                            return binary_search(dataset[mid + 1:],find_num)
                        else:
                            print('所找的数字在列表的前半边')
                            # dataset = dataset[:mid]
                            return binary_search(dataset[:mid],find_num)
                    else:
                        print('这个数在list外,这个数比这个列表里的所有数都大')
                else:
                    if dataset[0] == find_num:
                        print('只有一个元素',find_num)
                    else:
                        print('所找元素不在列表里')

binary_search(e,100)
            
            
**内置函数**
    https://book.apeland.cn/media/images/2019/03/21/chapter3-built-in.png
    
    内置参数详解https://docs.python.org/3/library/functions.html?highlight=built#ascii
    
    一个str或者bytes类型不能直接改,bytearray()方法把结果变成list,就可以改了
    
    isinstance()判断一个数据结构的类型
    每个函数的作用我都帮你标好了

abs # 求绝对值

all #Return True if bool(x) is True for all values x in the iterable.If the iterable is empty, return True.

any #Return True if bool(x) is True for any x in the iterable.If the iterable is empty, return False.

ascii #Return an ASCII-only representation of an object,ascii(“中国”) 返回”‘\u4e2d\u56fd’”

bin #返回整数的2进制格式

bool # 判断一个数据结构是True or False, bool({}) 返回就是False, 因为是空dict

bytearray # 把byte变成 bytearray, 可修改的数组

bytes # bytes(“中国”,”gbk”)

callable # 判断一个对象是否可调用

chr # 返回一个数字对应的ascii字符 , 比如chr(90)返回ascii里的’Z’

classmethod #面向对象时用,现在忽略

compile #py解释器自己用的东西,忽略

complex #求复数,一般人用不到

copyright #没用

credits #没用

delattr #面向对象时用,现在忽略

dict #生成一个空dict

dir #返回对象的可调用属性

divmod #返回除法的商和余数 ,比如divmod(4,2),结果(2, 0)

enumerate #返回列表的索引和元素,比如 d = [“alex”,”jack”],enumerate(d)后,得到(0, ‘alex’) (1, ‘jack’)

eval #可以把字符串形式的list,dict,set,tuple,再转换成其原有的数据类型。

exec #把字符串格式的代码,进行解义并执行,比如exec(“print(‘hellworld’)”),会解义里面的字符串并执行

exit #退出程序

filter #对list、dict、set、tuple等可迭代对象进行过滤, filter(lambda x:x>10,[0,1,23,3,4,4,5,6,67,7])过滤出所有大于10的值

float #转成浮点

format #没用

frozenset #把一个集合变成不可修改的

getattr #面向对象时用,现在忽略

globals #打印全局作用域里的值

hasattr #面向对象时用,现在忽略

hash #hash函数

help

hex #返回一个10进制的16进制表示形式,hex(10) 返回’0xa’

id #查看对象内存地址

input

int

isinstance #判断一个数据结构的类型,比如判断a是不是fronzenset, isinstance(a,frozenset) 返回 True or False

issubclass #面向对象时用,现在忽略

iter #把一个数据结构变成迭代器,讲了迭代器就明白了

len

list

locals

map # map(lambda x:x**2,[1,2,3,43,45,5,6,]) 输出 [1, 4, 9, 1849, 2025, 25, 36]

max # 求最大值

memoryview # 一般人不用,忽略

min # 求最小值

next # 生成器会用到,现在忽略

object #面向对象时用,现在忽略

oct # 返回10进制数的8进制表示

open

ord # 返回ascii的字符对应的10进制数 ord(‘a’) 返回97,

print

property #面向对象时用,现在忽略

quit

range

repr #没什么用

reversed # 可以把一个列表反转

round #可以把小数4舍5入成整数 ,round(10.15,1) 得10.2

set

setattr #面向对象时用,现在忽略

slice # 没用

sorted

staticmethod #面向对象时用,现在忽略

str

sum #求和,a=[1, 4, 9, 1849, 2025, 25, 36],sum(a) 得3949

super #面向对象时用,现在忽略

tuple

type

vars #返回一个对象的属性,面向对象时就明白了

zip #可以把2个或多个列表拼成一个, a=[1, 4, 9, 1849, 2025, 25, 36],b = [“a”,”b”,”c”,”d”],

list(zip(a,b)) #得结果
    [(1, 'a'), (4, 'b'), (9, 'c'), (1849, 'd')]

**名称空间**:存放名字x与1绑定关系的地方(x=1)
    名称空间有4种:LEGB
        1,locals:函数内部的名字空间,一般包括函数 的局部变量以及形式参数
        2,enclosing function:在嵌套函数 中外部函数的名字空间,若fun2嵌套在fun1里,
        对fun2来说,fun1的名字空间就是enclosing.
        3,globals:当前的模块空间,模块就是一些py文件,也就是说,globals()类似全局变量。
        4,__builtins__:内置模块空间,也就是内置或者内置函数的名字空间,
        print(dir(__builtins__))可查看包含的值.
        
    不同变量的作用域不同就是由这个变量所在的名称空间决定的。
            a。全局范围:全局存活,全局有效
            b。局部范围:临时存活,局部有效
        查看作用域的方法:globals(),locals()
LEGB代表名字查找顺序:locals->enclosing function->globals->__builtins__

**闭包**

def outer():
        name = '小猿圈,自学编程'
    
        def inner():
            print('Inner', name)
            
        return inner
        
    func = outer()   #返回的是inner的内存地址,inner
    func()   #相当于执行的是inner()
    
    闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外
                还包裹了一层作用域,这使得,该函数无论在何处调用,
                优先使用自己外层包裹的作用域。
                
                
**装饰器初识**    (开放--封闭原则)
        改变调用方式的(初级版):
        account = {
            'is_authenticated' : False,  # 用户登录了就把这个改为True
            'username' : 'alex',  #  假装这是DB里存的用户信息
            'password' :'abc123'  # 假装这是DB里存的用户信息
        }
        def login(func):
            if account['is_authenticated'] is False:
                username = input('user:').strip()
                password = input('password:').strip()
                if username == account['username'] and password == account['password']:
                    print('welcome login....')
                    account['is_authenticated'] = True
                    func()  # 认证成功,执行功能函数
                else:
                    print('wrong username or password')
            else:
                print('用户已登录,验证通过')
                func()  # 认证成功,执行功能函数
        def home():
            print('---HomePage---')
        def ameica():
            #login()    #  执行前加上验证
            print('---am_area----')
        def japan():
            print('---日韩专区---')
        def henan():
            print('-----河南专区-----')
        home()
        login(ameica)
        login(henan)
        
        
        
        不改变调用方式的(入门版):
        account = {
            'is_authenticated' : False,  # 用户登录了就把这个改为True
            'username' : 'alex',  #  假装这是DB里存的用户信息
            'password' :'abc123'  # 假装这是DB里存的用户信息
        }
        def login(func):
            def inner(*args, **kwargs):
                if account['is_authenticated'] is False:
                    username = input('user:').strip()
                    password = input('password:').strip()
                    if username == account['username'] and password == account['password']:
                        print('welcome login....')
                        account['is_authenticated'] = True
                        func(*args, **kwargs)  # 认证成功,执行功能函数
                    else:
                        print('wrong username or password')
                else:
                    print('用户已登录,验证通过')
                    func(*args, **kwargs)  # 认证成功,执行功能函数
            return inner
        def home():
            print('---HomePage---')
        @login   #  等价于ameica = login(ameica)
        def ameica():
            #login()    #  执行前加上验证
            print('---am_area----')
        def japan():
            print('---日韩专区---')
        #@pay
        @login   #  等价于henan = login(henan)  装饰器,语法糖
        def henan(vip_level):
            if vip_level > 3:
                print('解锁本专区所有高级玩法')
            else:
                print('-----河南专区vip-----')
        # home()
        # login(ameica)
        # login(henan)
        ameica = login(ameica)  # inner的内存地址
        henan = login(henan)    #inner的内存地址
        home()
        ameica()  # inner()
        henan(4)    #inner()

递归,装饰器,python常用内置方法的更多相关文章

  1. python常用内置方法

    常用内建函数# 如何在遍历一个列表的同时获取当前下标? # 普通人的做法 list = [1, 2, 3, 4, 5, 6] index = 0 for i in list: print('下标%s' ...

  2. python常用内置方法index\extend\count\reverse\sort

    定义列表:(有2个值相同) a = ['XiaoBao','aiaoHao','biaoLiao','ciaoQing','eiaoLi','QiBao','biaoLiao'] 列表的索引: fir ...

  3. python进阶04 装饰器、描述器、常用内置装饰器

    python进阶04 装饰器.描述器.常用内置装饰器 一.装饰器 作用:能够给现有的函数增加功能 如何给一个现有的函数增加执行计数的功能 首先用类来添加新功能 def fun(): #首先我们定义一个 ...

  4. python字符串常用内置方法

    python字符串常用内置方法 定义: 字符串是一个有序的字符的集合,用与存储和表示基本的文本信息. python中引号中间包含的就是字符串. # s1='hello world' # s2=&quo ...

  5. python迭代器-迭代器取值-for循环-生成器-yield-生成器表达式-常用内置方法-面向过程编程-05

    迭代器 迭代器 迭代: # 更新换代(其实也是重复)的过程,每一次的迭代都必须基于上一次的结果(上一次与这一次之间必须是有关系的) 迭代器: # 迭代取值的工具 为什么用迭代器: # 迭代器提供了一种 ...

  6. 迭代器,for循环本质,生成器,常用内置方法,面向过程编程

    一.迭代器 1.迭代:更新换代(重复)的过程,每次的迭代都必须基于上一次的结果 迭代器:迭代取值的工具 2.迭代器给你提供了一种不依赖于索引取值的方式 3.可以迭代取值的对象:字符串,列表,元组,字典 ...

  7. python常用内置函数和关键字

    常用内置方法 在Python中有许许多多的内置方法,就是一些Python内置的函数,它们是我们日常中经常可以使用的到的一些基础的工具,可以方便我们的工作. 查看所有的内置类和内置方法 # 方法一 bu ...

  8. python 字典内置方法get应用

    python字典内置方法get应用,如果我们需要获取字典值的话,我们有两种方法,一个是通过dict['key'],另外一个就是dict.get()方法. 今天给大家分享的就是字典的get()方法. 这 ...

  9. Python的内置方法,abs,all,any,basestring,bin,bool,bytearray,callable,chr,cmp,complex,divmod

    Python的内置方法 abs(X):返回一个数的绝对值,X可以是一个整数,长整型,或者浮点数,如果X是一个复数,此方法返回此复数的绝对值(此复数与它的共轭复数的乘积的平方根) >>> ...

随机推荐

  1. 四、spring的JDBC模板和事务管理

    Spring的JDBC模板 Spring是JavaEE开发的一站式框架,对各种持久化技术都提供了简单的模板 ORM持久化技术 模板类 JDBC org.springframework.jdbc.cor ...

  2. docker镜像仓库

    搭建私有镜像仓库 Docker Hub作为Docker默认官方公共镜像,如果想自己搭建私有镜像仓库,官方也提供registry镜像,使得搭建私有仓库非常简单. 下载registry镜像并启动 [roo ...

  3. 设计模式--简单工厂(Simple Factory)

    工厂模式是最常用的一种创建型模式,通常所说的工厂模式一般是指工厂方法模式.本篇是是工厂方法模式的“小弟”,我们可以将其理解为工厂方法模式的预备知识,它不属于GoF 23种设计模式,但在软件开发中却也应 ...

  4. js转换成字符串

    有两种方法: 1.对于boolean, number, string类型,可调用toString()方法 2.用String(var)方法 其中,第二种方法使用范围更广,可将没有toString()方 ...

  5. spring 事物(三)—— 声明式事务管理详解

    spring的事务处理分为两种: 1.编程式事务:在程序中控制事务开始,执行和提交:详情请点此跳转: 2.声明式事务:在Spring配置文件中对事务进行配置,无须在程序中写代码:(建议使用) 我对&q ...

  6. STL sort源码剖析

    转载自:http://www.cnblogs.com/imAkaka/articles/2407877.html STL的sort()算法,数据量大时采用Quick Sort,分段递归排序,一旦分段后 ...

  7. js变量var与let的区别

    1.作用域 通过var定义的变量,作用域是整个封闭函数,是全域的 .通过let定义的变量,作用域是在块级或是子块中. for (let i = 0; i < 10; i++) { // ... ...

  8. python 数组元素个数

    list=[1,2,3,{1,4,5,6,7}] print(len(list)) 输出4

  9. JavaSE---类、对象、成员变量、局部变量

    1.概述 1.1 类 1.1.1 类   是一种  自定义的  引用  数据类型: 1.2 对象 1.2.1 创建对象的根本途径:构造器: 通过new关键字   来调用  某个类的构造器: packa ...

  10. hdu1574 I Hate It (线段树,查询区间最大值)

    Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟 ...