Python学习之路第二天——迭代器、生成器、算法基础

一、迭代器:

迭代器是访问集合元素的一种方式。

迭代器对象是从集合的第一个元素开始访问,直到所有的元素被访问完结束。

迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。

另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件

特点:

  1. 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
  2. 不能随机访问集合中的某个值 ,只能从头到尾依次访问
  3. 访问到一半时不能往回退
  4. 便于循环比较大的数据集合,节省内存

1、创建一个迭代器:

x = iter([1, 2, 3, 4])
print(x)

以上实例输出结果:
<list_iterator object at 0x000000000107C1D0>

迭代器(iter)

2、迭代器操作:

__next__()函数:就是取迭代器内的值:
x = iter([1, 2, 3, 4])
print(x.__next__())
print(x.__next__())
print(x.__next__())
print(x.__next__())
print(x.__next__())
以上实例输出结果:
1
2
3
4
Traceback (most recent call last):
  File "E:/project/s12/day1/test.py", line 11, in <module>
    print(x.__next__())
StopIteration
注:当迭代器内的值全部取完后,就会报出如上错误。

取值(__next__())

二、生成器(yield):

定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器。

def cash_out(amount):
    while amount >0:
        amount -= 1
        yield 1
        print("擦,又来取钱了。。。败家子!")
ATM = cash_out(3)
print("取到钱 %s 万" % ATM.__next__())
print("花掉花掉!")
print("取到钱 %s 万" % ATM.__next__())
print("取到钱 %s 万" % ATM.__next__())

以上实例输出结果:
取到钱 1 万
花掉花掉!
擦,又来取钱了。。。败家子!
取到钱 1 万
擦,又来取钱了。。。败家子!
取到钱 1 万
注:yield函数可以使一个循环执行一半时做别的操作,然后再反回循环继续执行。

yield

作用:

yield的主要效果,就是可以使函数中断,并保存中断状态,中断后,代码可以去执行其他操作,其他操作完成后,还可以再重新调用这个函数,从上次yield的下一句开始执行。

3、yield接收参数:

yield实现在单线程的情况下实现并发运算的效果:

import time
def consumer(name):
    print("%s 准备吃包子啦!" %name)
    while True:
       baozi = yield
       print("包子[%s]来了,被[%s]吃了!" %(baozi,name))
def producer(name):
    c = consumer(‘A‘)
    c2 = consumer(‘B‘)
    c.__next__()
    c2.__next__()
    print("老子开始准备做包子啦!")
    for i in range(3):
        time.sleep(1)
        print("做了2个包子!")
        c.send(i)
        c2.send(i)
producer("Earl")

以上实例输出结果:
A 准备吃包子啦!
B 准备吃包子啦!
老子开始准备做包子啦!
做了2个包子!
包子[0]来了,被[A]吃了!
包子[0]来了,被[B]吃了!
做了2个包子!
包子[1]来了,被[A]吃了!
包子[1]来了,被[B]吃了!
做了2个包子!
包子[2]来了,被[A]吃了!
包子[2]来了,被[B]吃了!

send向yield传参数:

三、装饰器:

需求:当我们开发好了一个接口,这个接口是提供给用户使用,但是在使用过程中需要添加一下功能,在不改变接口调用方式与代码的情况下,增加这个功能,怎么办呢?这个时候就需要装饰器上场了。

def login(func):
    def x (user):
        if user == ‘earl‘:
            return func(user)
    return x
@login
def tv(name):
    print(‘欢迎%s,来到电视剧频道‘ %name)
tv(‘earl‘)

以上实例输出结果:
欢迎earl,来到电视剧频道

装饰器实例

装饰器传递参数实例:

def Before(request):
    print(‘before‘)

def After(request):
    print(‘after‘)

def Filter(before_func,after_func):
    def outer(main_func):
        def wrapper(request):
            before_result = before_func(request)
            if(before_result != None):
                return before_result;
            main_result = main_func(request)
            if(main_result != None):
                return main_result;
            after_result = after_func(request)
            if(after_result != None):
                return after_result;
        return wrapper
    return outer

@Filter(Before, After)
def Index(request):
    print(‘index‘)

Index(‘example‘)

以上实例输出结果:
before
index
after

装饰器传递参数:

说明:一个函数如果在函数名加上括号例如func()是执行func这个函数,如果不加括号例如func说是取func这个函数的内存id值,不执行函数,在迭代器中很多return调用的是只是函数名。所以在使迭代器中对这个要多注意。

四、递归:

特点

递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。
递归算法解决问题的特点:
(1) 递归就是在过程或函数里调用自身。
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。

1、利用函数编写如下数列:

斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368

def func(arg1, arg2):
    if arg1 == 0:
        print(arg1, arg2)
    arg3 = arg1 + arg2
    if arg3 < 10:
        print(arg3)
        func(arg2, arg3)

func(0,1)

以上实例输出结果:
0 1
1
2
3
5
8

递归实例:

2、通过递归实现2分查找:

def binary_search(data_list,find_num):
    mid_pos = int(len(data_list) /2 )
    mid_val = data_list[mid_pos]
    print(data_list)
    if len(data_list) >= 1:
        if mid_val > find_num:
            print("[%s] should be in left of [%s]" %(find_num,mid_val))
            binary_search(data_list[:mid_pos],find_num)
        elif mid_val < find_num:
            print("[%s] should be in right of [%s]" %(find_num,mid_val))
            binary_search(data_list[mid_pos:],find_num)
        else:
            print("Find ", find_num)
    else:
        print("cannot find [%s] in data_list" %find_num)
if __name__ == ‘__main__‘:
    primes = list(range(1,20))
    binary_search(primes,10)

    else:
        print("cannot find [%s] in data_list" %find_num)

if __name__ == ‘__main__‘:
    primes = list(range(1,30))
    binary_search(primes,10)

以上实例输出结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
[10] should be in left of [15]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
[10] should be in right of [8]
[8, 9, 10, 11, 12, 13, 14]
[10] should be in left of [11]
[8, 9, 10]
[10] should be in right of [9]
[9, 10]
Find  10

2分查找实例:

五、基础算法:

生成一个4*4的2维数组并将其顺时针旋转90度

array=[[col for col in range(5)] for row in range(5)] #初始化一个4*4数组
for row in array: #旋转前先看看数组长啥样
    print(row)

print(‘-------------‘)
for i,row in enumerate(array):

    for index in range(i,len(row)):
        tmp = array[index][i]
        array[index][i] = array[i][index]
        print(tmp,array[i][index])
        array[i][index] = tmp
    for r in array:print(r)

    print(‘--one big loop --‘)

以上实例输出结果:
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]
-------------
0 0
0 1
0 2
0 3
0 4
[0, 0, 0, 0, 0]
[1, 1, 2, 3, 4]
[2, 1, 2, 3, 4]
[3, 1, 2, 3, 4]
[4, 1, 2, 3, 4]
--one big loop --
1 1
1 2
1 3
1 4
[0, 0, 0, 0, 0]
[1, 1, 1, 1, 1]
[2, 2, 2, 3, 4]
[3, 3, 2, 3, 4]
[4, 4, 2, 3, 4]
--one big loop --
2 2
2 3
2 4
[0, 0, 0, 0, 0]
[1, 1, 1, 1, 1]
[2, 2, 2, 2, 2]
[3, 3, 3, 3, 4]
[4, 4, 4, 3, 4]
--one big loop --
3 3
3 4
[0, 0, 0, 0, 0]
[1, 1, 1, 1, 1]
[2, 2, 2, 2, 2]
[3, 3, 3, 3, 3]
[4, 4, 4, 4, 4]
--one big loop --
4 4
[0, 0, 0, 0, 0]
[1, 1, 1, 1, 1]
[2, 2, 2, 2, 2]
[3, 3, 3, 3, 3]
[4, 4, 4, 4, 4]
--one big loop --

4*4的2维数组实例:

时间: 2024-10-25 00:58:52

Python学习之路第二天——迭代器、生成器、算法基础的相关文章

Python学习之路第二天——函数

一.Python2.X内置函数表: 注:以上为pyton2.X内置函数,官方网址:https://docs.python.org/2/library/functions.html 二.Python3.X内置函数表: 注:以上为pyton3.X内置函数,官方网址:https://docs.python.org/3.5/library/functions.html 三.自定义函数: def 函数名(参数):     ... 函数体     ... def:是函数的关键字,告诉python解释器这是一

python学习之路 第二天

1.import 导入模块 #!/usr/bin/python # -*- coding:utf-8 -*- import sys print(sys.argv) 2.字符串常用方法: 移除空白: strip 分割: split 长度:len(obj) 索引:obj[1] 切片:obj[1:],obj[0:9] 3.列表创建方法: a = []1,2,3,4,5] a = list(1,2,3,4,5) 4.#!/usr/bin/python # -*- coding:utf-8 -*- a =

Python学习之路——第二弹(认识python)

第一弹中我是说明了学习python的目的,主要为了自我提升的考虑,那么为什么我对python感兴趣,python有什么用了?本章就简单说明下. python的用途很广,而且代码十分简洁,不像java.c等其他语言一样,对变量申明,调用类.库.函数等繁琐操作,而且代码结构清晰,会点英文,有的代码都能看得懂了. python主要应用于几个大的领域:科学计算,自动化运维,web开发,网络爬虫等,我了解python的原因也是因为项目要实现一个网络爬虫,但苦于项目成员对这方面之前都没接触过,所以我才去搜索

Python学习之路第二周汇总

# Author:Source #-*-coding:utf-8 -*- #使用第三方库,import 库名 '''import getpass password=getpass.getpass('Please input your password:') print(password)''' #自己建一个库,要让其生效要放在同一目录,或者放在site-packages(第三方库).若是在不同目录,需要添加新路径. '''account=input('input account!'.capita

Python学习之路第二天——字符处理

一.整数: 例如:1.10.30 整数可以做以下操作: bit_length函数:返回该整数占用的最少位数: >>> x=100 >>> x.bit_length() 7 位数值: >>> bin(100) '0b1100100 __abs__函数:返回绝对值: __abs__<==> abs() x= -100 y= 90 print("__abs__(x):", x.__abs__()) print("__

Python学习之路 第二篇 二进制及其相关转化

1.十进制和进制 十进制位权的理解: 12360=0*10(1-1)+6*10(2-1)+3*10(3-1)+2*10(4-1)+1*10(5-1)  (n-n)表示次方 2.二进制:二进制是计算机技术中广泛采用的一种数秩,是逢二进位的进位秩.0和1是基本算符.因为它使用0和1两个数字符号. 二进制转十进制: 110101011=2*(1-1)+2*(2-1)+0*(3-1)+2*(4-1)+0*(5-1)+2*(6-1)+0*(7-1)+2*(8-1)+2*(9-1)   (n-n)表示次方

Python学习之路-装饰器&生成器&正则表达式

装饰器 通俗的讲,装饰器就是在不改变源代码基础上,给源代码增加新功能. 不改变函数的源代码.调用方式.返回值等,给函数增加新功能. 经典案例:登录装饰器, def login_decorator(func):     def inner():         if USER_TEMP["status"] == False:             print("\033[31;1m用户未登录,请先登录\033[0m")             login_atm()

Python 学习之路(二)

Python 学习之路(二) 以下所用的是Python 3.6 一.条件语句 简单判断 1 if 判断条件: 2 执行语句-- 3 else: 4 执行语句-- 复杂判断 1 if 判断条件1: 2 执行语句1-- 3 elif 判断条件2: 4 执行语句2-- 5 elif 判断条件3: 6 执行语句3-- 7 else: 8 执行语句4-- 二.循环语句 2.1 while语句 和其他语言一样,不同的是多了else语句.在 python 中,while - else 在循环条件为 false

Python学习之路-Day1-Python基础

Python学习之路第一天 学习内容: 1.Python简介 2.安装 3.第一个Python程序 4.变量 5.字符编码 6.用户输入 7.表达式if..else语句 8.表达式for语句 9.break和continue 10.while循环 11.字符串格式化 1.python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承. 最新的TIOB