1、类(Class)

Python中的类的概念与其它语言类似,比较特殊的是protected和private在python中没有明确的限制,通常的惯例是用单下划线_表示protected,用双下划线开头__的表示private。

class A:
'''Class A'''
def __init__(self,x,y,name):
self.x=x
self.y=y
self.name=name
def introduce(self):
print(self.name)
def greeting(self):
print("what's up!")
def __12norm(self):
return self.x**2+self.y**2
def cla_12norm(self):
return self.__12norm()
a=A(11,11,'Lenaa')
print(A.__doc__) #打印类解释信息“Class A"
a.introduce()
a.greeting()
print(a.name)
print(a.cla_12norm())
print(a._A__12norm()) #仍然可以访问,只是名字不一样
print(a.__12norm()) #报错,是私有成员

类的初始化使用的是__init__(self,),所有成员变量都是self的,所以以self.开头。

双下划线开头的变量触发了Python中一种叫做name mangling的机制,其实只是名字变了,仍然可以通过前面加上”_类名“的方式访问

print(a._A__12norm())      #仍然可以访问,只是名字不一样。

Python中的继承非常简单,最基本的继承方式就是定义类的时候把父类放入括号里即可。

class B(A):
"""Class B inheritenced from A"""
def greeting(self):
print("how's going!")
b=B(12,12,'Flauree')
b.introduce()
b.greeting() # how's going!进行了方法覆盖
print(b.name) # 输出新的name___Flauree

2、map、reduce和filter

map 可以用于可遍历结构的每个元素执行同样的操作,批量操作:

y =map(lambda  x:x**2,[1,2,3,4])   #[1,4,9,16]
for i in y:
print(i)
map(lambda x,y:x+y,[1,2,3],[5,6,7]) #[6,8,10]

reduce则是对可遍历结构的元素按顺序进行两个输入参数的操作,并且每次的结果保存作为下次操作的第一个输入参数,还没有遍历的元素作为第二个输入参数:

reduce(lambda x,y:x+y,[1,2,3,4])     #((1+2)+3)+4=10

filter根据条件课对遍历结构进行筛选:

filter(lambda x:x%2,[1,2,3,4,5])   #筛选奇数,[1,3,5]

对于filter和map,在python2中返回结果是列表,在Python3中返回的是生成器。

zip()函数:可以把多个列表关联起来,可以按顺序同时输出两个列表对应位置的元素对。

zip()函数不会自动帮助判断两个列表是否长度一样,所以最终结果会以短的列表为准,想要以长的列表为准,可以考虑itertools模块中的izip_longest()函数。

for x in zip([1,2,3],[4,5,6]):
print(sum(x)) # 5,7,9

3、文件操作和pickle

在python中,推荐用上下文管理器(with-as)来打开文件,IO资源的管理更加安全,不用记着给文件执行close()函数,假设有个文件name_age.txt,里面存储着名字和年龄,格式如下:

Tom,8

Jerry,7

Tyke,3

....

# 读取文件内容并全部显示
with open('name_age.txt','r') as f:
lines=f.readlines()
for line in lines:
name,age=line.rstrip().split(',')
print('{} is {} years old.'.format(name,age))
# Tom is 8 years old.
# Jerry is 7 years old.
# Tyke is 3 years old.

open()函数的第一个参数是文件名,第二个参数是模式,文件的模式一般有4种:读取(r)、写入(w)、追加(a)、和读写(r+)。

有时候进行文件操作时希望把对象进行序列化,可以考虑用pickle模块。

import pickle
lines=[
"I'm like a dog chasing cars.",
"I wouldn't know what to do if ..",
"I'd just do things."
]
with open('lines.pkl','wb') as f: #序列化并保存成文件
pickle.dump(lines,f)
with open('lines.pkl','rb')as f: #从文件读取反序列化
lines_back=pickle.load(f)
print(lines_back) #和lines一样

注意:序列化的时候就要使用b模式了。Python2中有个效率更高的pickle脚cPickle,用法和pickle一样,在Python3中就只有一个pickle。

4、异常操作

在深度学习中,尤其是数据准备阶段,常常遇到IO操作,遇到异常的可能性很高,采用异常处理可以保证数据处理的过程中不被中断,并对有异常的情况进行记录。

for filepath in filelist:   #filelist是文件路径的列表
try:
with open(filepath,'r') as f:
#执行数据处理的相关工作
print('{} is processed!'.format(filepath))
except IOError:
print('{} with IOError!'.format(filepath))
# 异常的相应处理

5、多进程(multiprocessing)

深度学习中对数据高效处理常常会需要并行,这时多进程就派上了用场。假设在数据准备阶段,有很多文件需要运行一定的预处理,正好有多台核服务器,我们希望把这些文件分成32份,并行处理:

from multiprocessing import Process
def process_data(filelist):
for filepath in filelist:
print('Processing {}...'.format(filepath))
#处理数据
if __name__=='__main__':
#如果是在windows下,需要加上freeze_support()函数
freeze_support()
# full_list包含了要处理的全部文件列表
n_total=len(full_list) #一个远大于32的数
n_processes=32
# 每段子列表的平均长度
length=float(n_total)/float(n_processes)
# 计算下标,尽可能均匀地划分输入文件列表
indices=[int(round(i*length)) for i in range(n_processes+1)]
# 生成每个进程要处理的子文件列表
sublists=[full_list[indices[i]:indices[i+1]]for i in range(n_processes)]
# 生成进程
processes=[Process(target=process_data(),args=(x,))for x in sublists]
# 并行处理
for p in processes:
p.start()
for p in processes:
p.join()

第五节,python基本语法的更多相关文章

  1. 第四百一十五节,python常用排序算法学习

    第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...

  2. 第四百零五节,centos7下搭建sentry错误日志服务器,接收python以及Django错误,

    第四百零五节,centos7下搭建sentry错误日志服务器,接收python以及Django错误, 注意:版本,不然会报错 Docker >=1.11Compose >1.6.0 通过d ...

  3. 第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询

    第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询 1.elasticsearch(搜索引擎)的查询 elasticsearch是功能 ...

  4. 第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解

    第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解 信号一般使用信号分发器dispatcher.connect(),来设置信号,和信号触发函数,当捕获到信号时执行 ...

  5. 第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图

    第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图 1.基本概念 2.反爬虫的目的 3.爬虫和反爬的对抗过程以及策略 scra ...

  6. 第8.4节 Python类中不是构造方法却胜似构造方法的__new方法__深入剖析:语法释义

    一.    引言 在本博前面的内容都对构造方法__init__进行了介绍,也在前面章节引入了__new__方法,但老猿认为__new__方法比构造方法__init__更应该属于构造方法.这是因为在Py ...

  7. 第8.1节 Python类的构造方法__init__深入剖析:语法释义

    一.    引言 凡是面向对象设计的语言,在类实例化时都有构造方法,很多语言的构造方法名与类名一致,Python中类的构造方法比较特殊,必须是__init__特殊方法. 二.    语法释义 1.   ...

  8. 第8.25节 Python风格的__getattribute__属性访问方法语法释义及使用

    一. 引言 在<第8.13节 Python类中内置方法__repr__详解>老猿介绍了在命令行方式直接输入"对象"就可以调用repr内置函数或__repr__方法查看对 ...

  9. 【转】Python基础语法

    [转]Python基础语法 学习一门编程语言,通常是学习该语言的以下几个部分的内容: 基础语法:如,变量的声明与调用.基本输出语句.代码块语法.注释等: 数据类型:通常都为 数字.字符串.布尔值.数组 ...

  10. python接口测试自动化之python基础语法

    一.pycharm的使用和python基本语法 (一).pycharm的使用和python环境 1.python以及pycharm的安装 python 的版本选择:3.x 版本,不要安装2.x 版本, ...

随机推荐

  1. (四)Exploring Your Cluster

    The REST API Now that we have our node (and cluster) up and running, the next step is to understand ...

  2. LOJ3053 十二省联考2019 希望 容斥、树形DP、长链剖分

    传送门 官方题解其实讲的挺清楚了,就是锅有点多-- 一些有启发性的部分分 L=N 一个经典(反正我是不会)的容斥:最后的答案=对于每个点能够以它作为集合点的方案数-对于每条边能够以其两个端点作为集合点 ...

  3. split函数用法

    split函数详解   split翻译为分裂.  split()就是将一个字符串分裂成多个字符串组成的列表. split()当不带参数时以空格进行分割,当代参数时,以该参数进行分割. //---当不带 ...

  4. IntelliJ IDEA 2018.3 重大升级,哪些功能打动了你?

    前言 2018.11.28 IntelliJ IDEA 2018.3 正式版发布.对于一个忠实爱好者,迫不及待的我下载了最新版本来体验下.而且 IDEA 今年的第三次重大更新提供了不容错过的显著功能! ...

  5. 如何基于Winform开发框架或混合框架基础上进行项目的快速开发

    在开发项目的时候,我们为了提高速度和质量,往往不是白手起家,需要基于一定的基础上进行项目的快速开发,这样可以利用整个框架的生态基础模块,以及成熟统一的开发方式,可以极大提高我们开发的效率.本篇随笔就是 ...

  6. KeyError: 'Spider not found: test'

    Error Msg: File "c:\python36\lib\site-packages\scrapy\cmdline.py", line 157, in _run_comma ...

  7. 深入剖析Redis系列: Redis集群模式搭建与原理详解

    前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...

  8. MySQL源码包编译安装

    +++++++++++++++++++++++++++++++++++++++++++标题:MySQL数据库实力部署时间:2019年3月9日内容:MySQL源码包进行编译,然后部署MySQL单实例重点 ...

  9. NOIP2001提高组复赛B 数的划分

    题目链接:https://ac.nowcoder.com/acm/contest/249/B 题目大意: 略 分析1(记忆化搜索): 方法为减而治之,把n划分成k份的答案就相当于每次把n分成a,b两个 ...

  10. CentOS 7安装MongoDB

    1 下载安装包 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.2.4.tgz 2 解压 .tgz 3 将解压包 ...