day14 可迭代对象与迭代器对象 迭代器对象总结 生成器对象 小练习 函数递归调用 二分法 今晚面试题

今日早晨默写:

有参认证功能装饰器加使用

=================================================================================

可迭代对象与迭代器对象

 1.什么是迭代器

  迭代是一个重复的过程,但每次重复都是基于上一次重复的结果而继续

  下列循环知识单纯的重复

  

        while True:
            print(1)

        # 基于索引的迭代取值
        l=['a','b','c']
        i=0

        while i < len(l):
            print(l[i])
            i+=1

   什么是迭代器?

     迭代取值的工具

2.为什么用迭代器

  迭代器

    优点:

      1.提供一种不依赖索引迭代取值的方式

      2.更节省内存

    缺点:

      1.不如按照索引的取值方式灵活

      2.取值一次性的,只能往后取,无法预测值的个数

3.如何用迭代器

  可迭代的对象:strlist upledictset文件对象

    但凡内置有__iter__方法的对象都称之为可迭代对象

  迭代器对象:文件对象

    既内置有__iter__方法又内置有__next__方法的对象都称之为迭代器对象

  调用可迭代对象下__iter__方法,会有一个返回值,该返回值就是内置的迭代器对象

'''

# s='abcdef'
# l=['a','b','c']
# d={'k1':111,'k2':222,'k3':333}

# iter_d=d.__iter__()
# # print(iter_d)
#
# try:
#     print(iter_d.__next__())
#     print(iter_d.__next__())
#     print(iter_d.__next__())
#     print(iter_d.__next__())
# except StopIteration:
#     print('取值完毕')


d={'k1':111,'k2':222,'k3':333}
# d={1,2,3,4,5}
# d=[1,2,3,4]

# iter_d=d.__iter__()
# iter_d=iter(d) #d.__iter__

# print(next(iter_d)) #iter_d.__next__()

# print(len(d))
print(d.__len__())


# print(iter_d.__iter__().__iter__().__iter__() is iter_d)

# print(d.__iter__().__next__())
# print(d.__iter__().__next__())
# print(d.__iter__().__next__())



# while True:
#     try:
#         v=iter_d.__next__()
#         print(v)
#     except StopIteration:
#         break
#
# print('第二次取值')
#
# iter_d=d.__iter__()
# while True:
#     try:
#         v=iter_d.__next__()
#         print(v)
#     except StopIteration:
#         break
#

# for k in d:
#     print(k)

#for循环的底层原理:
# 1. 调用in后面那个值/对象的__iter__方法,拿到一个迭代器对象iter_obj
# 2. 调用迭代器对象iter_obj.__next__()将得到的返回值赋值变量名k,循环往复直到取值完毕抛出异常StopIteration
# 3. 捕捉异常结束循环

迭代器对象总结

生成器

生成器就是一种自定义的迭代器

如何得到生成器?

  但凡函数内出现yield关键字,再去调用户数不会立即执行函数体代码,会得到一个返回值,该返回值就是

生成器对象,即自定义的迭代器

'''

#
# def func():
#     print('first')
#     yield 1
#     print('second')
#     yield 2
#     print('third')
#     yield 3
#
#
# g=func()
# # print(g)
#
# res1=next(g)
# print(res1)
#
# res2=next(g)
# print(res2)
#
# res3=next(g)
# print(res3)
#
# next(g)
# 总结yield:
# 1. 提供一种自定义迭代器的解决方案
# 2. yield & return
#    相同点: 都可以返回值,返回值没有类型限制个数限制
#    不同点: return只能返回一次值,yield却可以让函数暂停在某一个位置,可以返回多次值


#原理
# def my_range(start,stop,step=1):
#     while start < stop: # 5 < 5
#         yield start # 3
#         start+=step #start=5

# range(1,5,2) # 1 3
# for i in my_range(1,5000000000000000000000000000000000000000000,2): # 1 3
#     print(i)

小练习

1.函数递归调用

   在调用一个函数的过程又直接或者间接地调用该函数本身,称之为递归调用

  递归必须满足两个条件:

    1.每进入下一次递归调用,问题的规模都应该有所减少

    2.递归必须有一个明确的结束条件

以下递归只是单纯的重复,没有意义

# 以下递归只是单纯的重复,没有意义
def func():
    print(1)
    print(2)
    print(3)
    func()

func()

def bar():
    print('from bar')
    foo()

def foo():
    print('from foo')
    bar()

foo()

递归有两个明确的阶段

1.回溯

2.递推

# age(5)=age(4)+2        #这是回溯阶段 然后再进行递推
# age(4)=age(3)+2
# age(3)=age(2)+2
# age(2)=age(1)+2
# age(1)=18

# age(n)=age(n-1)+2  # n > 1
# age(1)=18          # n = 1

# def age(n):
#     if n == 1:
#         return 18
#     return age(n-1)+2
#
# print(age(5))

递归取值相关代码

l=[1,[2,[3,[4,[5,[6,[7,[8,[9,]]]]]]]]]

def func(list1):
    for item in list1:
        if type(item) is not list:
            print(item)
        else:
            # 如果是列表,应该...
            func(item)

func(l)
nums=[3,5,7,11,13,23,24,76,103,111,201,202,250,303,341]

find_num=203
for num in nums:
    if num == find_num:
        print('find it')
        break
else:
    print('not exists')

 二分法

nums = [3, 5, 7, 11, 13, 23, 24, 76, 103, 111, 201, 202, 250, 303, 341]

def binary_search(list1, find_num):
    print(list1)
    if len(list1) == 0:
        print('not exist')
        return
    mid_index = len(list1) // 2
    if find_num > list1[mid_index]:
        print('in the right')
        binary_search(list1[mid_index + 1:], find_num)
    elif find_num < list1[mid_index]:
        print('in the left')
        binary_search(list1[:mid_index], find_num)
    else:
        print('find it')

binary_search(nums, 111)

今晚面试题

1.Python 是强语言类型还是弱语言类型?

2.a=1,b=2,不用中间变量交换 a 和 b 的值?

3.Python2 中 range 和 xrange 的区别?

4.以下 Python 程序的输出?

 for i in range(5,0,-1):
     print(i)

5.read、readline 和 readlines 的区别?

6.有大小写字母的字符串,要求是如果字符串中大写字母的数量小于等于小写字母的数量,则把字符串全部变小写,反之则将字符串全部变为大写 

#python
#示例
# solve('coDe')——>>'code'
# solve('CODe')——>>'CODE'

7.现有字典 d={‘a’:24,‘g’:52,‘i’:12,‘k’:33}请按字典中的 value值进行排序?

8.将字符串"k:1|k1:2|k2:3|k3:4",处理成 Python 字典:{‘k’:1, ‘k1’:2, ... } 

9.请用迭代器实现斐波那契数列?

简单地说,起始两项为 0 和 1,此后的项分别为它的前两项之和

10.请用递归的方式打印出下列数据类型中每一个元素

#python
l = [1,[2,[3,[4,[5,[6,[7,[8,[9]]]]]]]]]

  

原文地址:https://www.cnblogs.com/wangmiaolu/p/10044133.html