Python3高级基础(2)
1 Python3模拟数据结构
1.1 栈
栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表。栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈)。
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
1.进栈(PUSH)算法
①若TOP≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②);
②置TOP=TOP+1(栈指针加1,指向进栈地址);
③S(TOP)=X,结束(X为新进栈的元素);
2.退栈(POP)算法
①若TOP≤0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈, 空则下溢;不空则作②);
②X=S(TOP),(退栈后的元素赋给X):
③TOP=TOP-1,结束(栈指针减1,指向栈顶)
lst=[]
def pop():
if(len(lst)==0):
print("栈为空","无法出栈")
else:
print("此次出栈元素为:",lst.pop())
def push(i):
lst.append(i)
push(1)
push(2)
push(3)
pop()
pop()
pop()
pop()
此次出栈元素为: 3
此次出栈元素为: 2
此次出栈元素为: 1
栈为空 无法出栈
1.2 队
像栈一样,队列(queue)也是一种线性表,它的特性是先进先出,插入在一端,删除在另一端。就像排队一样,刚来的人入队(push)要排在队尾(rear),每次出队(pop)的都是队首(front)的人。如图1,描述了一个队列模型。
队列(Queue)与栈一样,是一种线性存储结构,它具有如下特点:
- 队列中的数据元素遵循“先进先出”(First In First Out)的原则,简称FIFO结构。
- 在队尾添加元素,在队头删除元素。
lst=[]
def enpush(i): # 入队操作
lst.append(i)
def enpop(): # 出队操作
if(len(lst)==0):
print("队列为空,无法出队")
else:
print("出队元素为:",lst.pop(0))
enpush(10)
enpush(20)
enpush(2)
enpop()
enpop()
enpop()
enpop()
出队元素为: 10
出队元素为: 20
出队元素为: 2
队列为空,无法出队
2 迭代器(iterator)
特点
节省内存
比如展现一个上亿元素的列表并计算,sum([i*i for i in range(1000000000)])
内存小的机器肯定要宕机
惰性机制
调用一次__next__方法,执行一次
单向执行,不可逆
既就是迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完后结束,只能往前不能后退。
2.1 判断对象是不是可迭代对象
常见的迭代对象:包含**字符串str、列表list、元组tuple、字典dict、集合set、range以及文件句柄**
1. 第一种判断方法__iter__
myStr = 'bright'
myList = [1,2,3,4,5]
print('__iter__' in dir(myStr))
print('__iter__' in dir(myList))
True
True
2. 第二种判断方法 isinstance('abc',Iterable)
myStr = "bightYU"
myList = [1,3,4,5,6,7]
from collections import Iterable
print(isinstance(myStr,Iterable))
print(isinstance(myList,Iterable))
print(isinstance(123,Iterable))
True
True
False
2.2 创建迭代器的方法
将可迭代对象转化为迭代器
- 第一种方法__iter__()
str1="abcdegggg"
list1=[1,3,4,5]
obj_str=str1.__iter__()
obj_list=list1.__iter__()
print(obj_str)
print(obj_list)
<str_iterator object at 0x000001CA66A4ECC0>
<list_iterator object at 0x000001CA66A4EEF0>
2. 第二种方法iter()
str1="abcdegggg"
list1=[1,3,4,5]
obj_str=iter(str1)
obj_list=iter(list1)
print(obj_str)
print(obj_list)
<str_iterator object at 0x000001CA66A4EF60>
<list_iterator object at 0x000001CA667A6CC0>
2.3 判断对象是不是迭代器
- 内部含有__iter__ 且含有__next__方法的对象就是迭代器,遵循迭代器协议
str1="abcdegggg"
list1=[1,3,4,5]
obj_str=str1.__iter__()
obj_list=list1.__iter__()
print('__iter__' in dir(str1))
print('__next__' in dir(str1))
print('__iter__' in dir(obj_str))
print('__next__' in dir(obj_str))
True
False
True
True
可以看到,str1虽然是可迭代对象,但是内部不含有__next__方法,所以不是迭代器
- isinstance(obj_list,Iterable)
from collections import Iterable
str1="abcdegggg"
list1=[1,3,4,5]
obj_str=str1.__iter__()
obj_list=list1.__iter__()
print(isinstance(list1,Iterable))
print(isinstance(obj_list,Iterable))
print(isinstance(124,Iterable))
True
True
False
3 生成器
在Python中,使用了yield的函数被称为生成器(generator)
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,等简单的理解生成器就是一个迭代器。在调用生成器的运行的过程中,每当遇到yield时函数会暂停并保存当前所有的运行信息,返回yield的值,并在下一次执行next()方法是从当前暂停的位置继续运行。
调用一个生成器,返回的是一个迭代器对象。
3.1 创建生成器
def scq():
print('11')
yield print('22')
yield print('33')
yield print('44')
r = scq()
print(type(r), r)
<class 'generator'> <generator object scq at 0x000001CA66A15FC0>
ret = r.__next__()
11
22
'''
下面示例中gener_obj=func1()为生成器对象
next() 和 yield 必须一一对应
每调用一次__next__()执行一个yield
如果__next__()多于yield则会报错
'''
def func1():
print(1111)
yield 1
print(2222)
yield 2
print(3333)
yield 3
print(4444)
gener_obj=func1()
print(gener_obj.__next__())
print(gener_obj.__next__())
print(gener_obj.__next__())
1111
1
2222
2
3333
3
3.2 生成器例子
def cloth():
for i in range(1,1000):
yield '衣服%s'%i
ger_obj=cloth()
for i in range(3):
print('结果:', ger_obj.__next__())
结果: 衣服1
结果: 衣服2
结果: 衣服3
def cloth():
for i in range(1,1000):
yield '衣服%s'%i
ger_obj=cloth()
for i in range(3):
print(ger_obj.__next__())
print('-'*20)
for i in range(5):
print(ger_obj.__next__())
衣服1
衣服2
衣服3
--------------------
衣服4
衣服5
衣服6
衣服7
衣服8
4 图片处理例子
import cv2
img = cv2.imread('pythontab.jpg', cv2.IMREAD_COLOR) # 彩色图模式加载一副彩图
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('lena.png', img)
True
5 Python3开发面试题
【引自】http://www.cnblogs.com/ManyQian/p/9152002.html
题目:
编写Python脚本,分析xx.log文件,按域名统计访问次数
xx.log文件内容如下:
https://www.sogo.com/ale.html
https://www.qq.com/3asd.html
https://www.sogo.com/teoans.html
https://www.bilibili.com/2
https://www.sogo.com/asd_sa.html
https://y.qq.com/
https://www.bilibili.com/1
https://dig.chouti.com/
https://www.bilibili.com/imd.html
https://www.bilibili.com/
输出:
4 www.bilibili.com
3 www.sogo.com
1 www.qq.com
1 y.qq.com
1 dig.chouti.com
解题思路:
1、先获取数据就是域名
获取数据我们可以用正则,或者域名还是有相同点可以用split切分
2、统计域名访问的次数
可以用Python的内置模块来统计,
3、然后就是输出要求的格式
sorted内置函数用来排序
import re
from collections import Counter
with open("xx.log","r",encoding="utf-8") as f:
data=f.read()
res=re.findall(r"https://(.*?)/.*?", data)
dic=Counter(res)
ret = sorted(dic.items(), key=lambda x:x[1], reverse=True)
for k,v in ret:
print(v,k)
4 www.bilibili.com
3 www.sogo.com
1 www.qq.com
1 y.qq.com
1 dig.chouti.com
引用文献
【队】https://blog.csdn.net/zhongguozhichuang/article/details/53196415
【栈】https://blog.csdn.net/menxiaoyuan/article/details/51029675
Python3高级基础(2)的更多相关文章
- Python3高级基础(1)
目录 Introducing Python Object Types 对象类型的优势 Python的核心数据类型 数字 = Number 字符串 列表 = lists 字典 = dictionary ...
- Python3高级核心技术97讲
可以毫不夸张的说:这门课程是初中级Python开发人员向高级进阶的必学课程 许多Pythoner喜欢追求新的框架,但却不重视Python本身基础知识的学习, 他们不知道的是,语言本身的进阶优先于框架, ...
- 微信小程序高级基础
微信小程序高级基础 微信小程序的注册和服务器配置: 小程序是什么呢?小程序是一种不需要下载安装就可以使用的应用,它实现了应用"触手可及"的梦想,用户扫一扫或者搜一下就可以打开应用, ...
- python3高级编程
1. SMTP发送邮件 internet相关协议: http:网页访问相关,httplib,urllib,xmlrpclib ftp:文件传输相关, ftplib, urllib nntp:新闻和帖子 ...
- Java 高级基础——反射
Java 高级基础--反射 反射的意义:Java 强类型语言,但是我们在运行时有了解.修改信息的需求,包括类信息.成员信息以及数组信息. 基本类型与引用类型 基本类型,(固定的 8 种) 整数:byt ...
- python_way ,day1 编译安装python3、基础及流程控制
本节内容: 1,Python介绍发展史 2,安装 3,Hello World 4,程序 5,变量,字符编码 6,用户输入 7,模块初识 一.python介绍 python的创始人为吉多·范罗苏姆(Gu ...
- python3.0_day9_scoket基础之篇
一.socket简单介绍 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求 ...
- python3【基础】-赋值与深浅拷贝
一.Python的变量及其存储 在高级语言中,变量是对内存及其地址的抽象.对于python而言,python的一切变量都是对象,变量的存储,采用了引用语义的方式,存储的只是一个变量的值所在的内存地址, ...
- Python全栈工程师(Python3 所有基础内容 0-0)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 为了梦想为了信仰 开局一张图 Python一个月的基础语法 基本就到这咯 接下来是数据 ...
随机推荐
- 配置samba文件服务器
1.打开"终端窗口",输入"sudo apt-get update"-->回车-->"输入当前登录用户的管理员密码"--> ...
- 使用python命令构建最简单的web服务
可以使用python自带的包建立最简单的web服务器,使用方法: 1)切换到服务器的根目录下 2)输入命令: python -m SimpleHTTPServer 3)使用wget或者在浏览器访问测试 ...
- 50个常用的sql语句
50个常用的sql语句 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,T ...
- 转 利用 Console 来学习、调试JavaScript
利用 Console 来学习.调试JavaScript 一 什么是 Console Console 是用于显示 JS和 DOM 对象信息的单独窗口.并且向 JS 中注入1个 console 对象 ...
- sklearn,交叉验证中的分层抽样
StratifiedKFold用法类似Kfold,但是他是分层采样,确保训练集,测试集中各类别样本的比例与原始数据集中相同. 例子: import numpy as np from sklearn.m ...
- Python-css高级
1. 伪类和伪元素 1. 伪类 1. :link 2. :visited 3. :hover (重要) 4. :active 5. :focus(input标签获取光标焦点) 2. 伪元素 1. :f ...
- js有关事件驱动
事件驱动 /* 什么是事件? 1.事件发生了 2.我要对这个事件做对应的处理 ...
- python 全栈开发,Day124(MongoDB初识,增删改查操作,数据类型,$关键字以及$修改器,"$"的奇妙用法,Array Object 的特殊操作,选取跳过排序,客户端操作)
一.MongoDB初识 什么是MongoDB MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介 ...
- Redis的优势和特点
Redis的特点: 内存数据库,速度快,也支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用. Redis不仅仅支持简单的key-value类型的数据,同时还提供list ...
- CentOS安装redis-audit 但执行时出错未解决 记录一下安装过程
网上很多安装过程都太老了,测试很多方法终于成功了,但执行时还是出错,哪位熟悉的可以告知一下. yum install -y ruby rubygems ruby-devel git gcc gem s ...