标签分类 热门分类
当前位置:首页 > 程序设计电子书 > Python3.7电子书网盘下载
Python3.7从零开始学

Python3.7从零开始学 全书影印版电子书

官方价: 21.99

更 新:

Python3.7从零开始学 (pdf、epub、mobi、azw3)下载

下载地址:https://pan.baidu.com/s/1-iHTw0e42GW4L-nyZc17O

分享码:xvh4

给大家带来的一篇关于Python3.7相关的电子书资源,介绍了关于Python 3.7、从零开始学、兄弟连方面的内容,本书是由清华大学出版社出版,格式根据源资源分为PDF、epub、mobi、azw3其中一种或多种格式,资源大小75.8 MB,刘宇宙/刘艳编写,目前豆瓣、亚马逊、当当、京东等电子书综合评分为:9.9,更多相关的学习资源可以参阅 程序设计电子书Python电子书、等栏目。

Python3.7从零开始学 PDF

读者评价

python 3.5那本就写的就不错.... python3.7版本升级,内容拓展了..还赠送 八大主题功能... 最最让我心动的是 扫描看视频... 省去了自学的苦恼...... 抢先预订一本.....

入手10天了,已经学习好几章了,书籍结合各章的视频一起看,学习即高效又轻松,很庆幸没有买错,对初学者,是非常棒的一本书。

非常不错的一本书,对于初学者而言,可以循序渐进的对Python 3.7进行了解和学习。

技术新,内容丰富,小程序学习课件,大量视频,值得入手一本。

编辑推荐

本书专门针对Python新手量身定做,是编者学习和使用Python开发过程中的体会和经验总结,涵盖实际开发中重要的知识点,内容详尽,代码可读性及可操作性强。

本书主要介绍Python语言的类型和对象、操作符和表达式、编程结构和控制流、函数、序列、多线程、正则表达式、面向对象编程、文件操作、网络编程、邮件收发、数据库操作等,并安排了Python爬虫、自然语言处理和区块链项目范例,各章还安排了调试、问题解答、温故知新、牛刀小试等内容,以帮助读者学会处理程序异常,解决学习中的困惑,巩固知识、学以致用。

本书的另一个特色是,使用通俗易懂的描述和丰富的示例代码,并结合日常生活中的一些小事件,使本书读起来生动有趣,把复杂的问题以简单的形式展现出来,使读者学起来很轻松,充分感受到学习Python编程的乐趣和魅力。

内容介绍

本书专门针对Python新手量身编写,涵盖Python 3实际开发的重要知识点,内容包括:Python语言的类型和对象、操作符和表达式、编程结构和控制流、函数、序列、多线程、正则表达式、面向对象编程、文件操作、网络编程、邮件收发、数据库操作等,提供Python爬虫、自然语言处理、区块链项目范例,各章还安排了调试、问题解答、温故知新、牛刀小试等内容,以帮助读者学会处理程序异常、解答学习困惑、巩固知识、学以致用。
本书还开发了配套小程序学习课件,课件中涵盖视频教学、代码示例、资源包、扩展知识、习题、PPT、FAQ、作业8大主题,大幅扩展了本书知识体系,可帮助读者轻松快速地掌握Python编程技能。
本书技术先进、示例丰富、代码可读性及可操作性强,非常适合Python初学者和转型到Python开发的程序员使用,也可作为Python网课、培训机构及大专院校的教学用书。

内容节选

Windows下python3.7安装教程

记录了Windows安装python3.7的详细过程,供大家参考,具体内容如下

1. 在python的官网下载python对应版本:官网地址

64位下载Windows x86-64 executable installer 版本

32位下载Windows x86 executable installer 版本

打开链接如下图,版本会一直更新,选择任意一个适合自己电脑的版本就好

2.勾选 Add python to PATH 添加路径

安装界面点击Customize installation 自定义安装

3.不改变默认进行Next下一步

4.选择一个自己喜欢的安装位置

点击Install开始安装

5.等待进度条加载完毕

6.安装完毕,点击Close关闭

若方框位置出现管理员字样则点击授权再关闭

7.验证:运行cmd

进入到自己的安装目录下,运行语句:python -V

若显示出Python对应版本则表示安装成功

目录

  • 目   录
  • 第1章  进入Python 3.7的精彩世界    1
  • 1.1  Python的起源    1
  • 1.2  Python的应用场合    2
  • 1.3  从2.7到3.7,Python的新特性    4
  • 1.4  如何学习Python    6
  • 1.5  Python环境构建    7
  • 1.5.1  在Windows系统中安装Python    7
  • 1.5.2  在Linux、UNIX系统和Mac中安装Python    14
  • 1.5.3  其他版本    14
  • 1.6  从Hello World开始    14
  • 1.7  调试    15
  • 1.8  问题解答    16
  • 1.9  温故知新,学以致用    17
  • 第2章  开启Python之旅    18
  • 2.1  认识程序    18
  • 2.1.1  程序    18
  • 2.1.2  调试    19
  • 2.1.3  语法错误    19
  • 2.1.4  运行错误    20
  • 2.1.5  语义错误    20
  • 2.2  数据类型    20
  • 2.2.1  整型    21
  • 2.2.2  浮点型    22
  • 2.2.3  复数    23
  • 2.2.4  数据类型转换    23
  • 2.2.5  常量    24
  • 2.3  变量和关键字    24
  • 2.3.1  变量    24
  • 2.3.2  变量名称    28
  • 2.4  语句    29
  • 2.5  表达式    30
  • 2.6  运算符和操作对象    31
  • 2.6.1  什么是运算符和操作对象    31
  • 2.6.2  算术运算符    31
  • 2.6.3  比较运算符    32
  • 2.6.4  赋值运算符    34
  • 2.6.5  位运算符    35
  • 2.6.6  逻辑运算符    36
  • 2.6.7  成员运算符    36
  • 2.6.8  身份运算符    37
  • 2.6.9  运算符优先级    37
  • 2.7  字符串操作    39
  • 2.8  注释    42
  • 2.9  牛刀小试——九九乘法表实现    43
  • 2.10  调试    44
  • 2.11  问题解答    44
  • 2.12  温故知新,学以致用    45
  • 第3章  列表和元组    47
  • 3.1  通用序列操作    47
  • 3.1.1  索引    47
  • 3.1.2  分片    49
  • 3.1.3  序列相加    51
  • 3.1.4  乘法    52
  • 3.1.5  成员资格    53
  • 3.1.6  长度、最小值和最大值    54
  • 3.2  列表    54
  • 3.2.1  更新列表    54
  • 3.2.2  嵌套列表    58
  • 3.2.3  列表方法    59
  • 3.3  元组    66
  • 3.3.1  tuple函数    67
  • 3.3.2  元组的基本操作    67
  • 3.3.3  元组内置函数    68
  • 3.4  列表与元组的区别    69
  • 3.5  牛刀小试——列表与元组相互转化    70
  • 3.6  调试    70
  • 3.7  问题解答    71
  • 3.8  温故知新,学以致用    72
  • 第4章  字符串    74
  • 4.1  字符串的基本操作    74
  • 4.2  字符串格式化    75
  • 4.2.1  字符串格式化符号    75
  • 4.2.2  字符串格式化元组    77
  • 4.3  字符串方法    80
  • 4.3.1  find()方法    80
  • 4.3.2  join()方法    81
  • 4.3.3  lower()方法    81
  • 4.3.4  upper()方法    82
  • 4.3.5  swapcase()方法    83
  • 4.3.6  replace()方法    83
  • 4.3.7  split()方法    84
  • 4.3.8  strip()方法    84
  • 4.3.9  translate()方法    85
  • 4.4  牛刀小试——变形金刚    86
  • 4.5  调试    86
  • 4.6  问题解答    87
  • 4.7  温故知新,学以致用    87
  • 第5章  字典    89
  • 5.1  字典的使用    89
  • 5.2  创建和使用字典    90
  • 5.2.1  dict函数    90
  • 5.2.2  字典的基本操作    91
  • 5.2.3  字典的格式化字符串    92
  • 5.2.4  字典和列表的区别    93
  • 5.3  字典方法    93
  • 5.3.1  clear()方法    94
  • 5.3.2  copy()方法    95
  • 5.3.3  fromkeys()方法    95
  • 5.3.4  get()方法    96
  • 5.3.5  key in dict方法    96
  • 5.3.6  items()方法    97
  • 5.3.7  keys()方法    97
  • 5.3.8  setdefault()方法    98
  • 5.3.9  update()方法    98
  • 5.3.10  values()方法    99
  • 5.4  牛刀小试——字典合并与排序    99
  • 5.5  调试    100
  • 5.6  问题解答    101
  • 5.7  温故知新,学以致用    101
  • 第6章  条件、循环和其他语句    103
  • 6.1  使用文本编辑器    103
  • 6.2  import的使用    105
  • 6.2.1  import语句    105
  • 6.2.2  使用逗号输出    108
  • 6.3  别样的赋值    108
  • 6.3.1  序列解包    108
  • 6.3.2  链式赋值    109
  • 6.3.3  增量赋值    110
  • 6.4  语句块    111
  • 6.5  条件语句    111
  • 6.5.1  布尔变量的作用    111
  • 6.5.2  if语句    112
  • 6.5.3  else子句    114
  • 6.5.4  elif子句    114
  • 6.5.5  嵌套代码块    115
  • 6.5.6  更多操作    115
  • 6.5.7  断言    118
  • 6.6  循环    118
  • 6.6.1  while循环    119
  • 6.6.3  循环遍历字典元素    122
  • 6.6.4  迭代工具    123
  • 6.6.5  跳出循环    124
  • 6.6.6  循环中的else子句    126
  • 6.7  pass语句    127
  • 6.8  牛刀小试——猜字游戏编写    128
  • 6.9  Python程序调试    129
  • 6.10  问题解答    130
  • 6.11  温故知新,学以致用    131
  • 第7章  函数    133
  • 7.1  调用函数    133
  • 7.2  定义函数    135
  • 7.3  函数的参数    137
  • 7.3.1  必须参数    138
  • 7.3.2  关键字参数    138
  • 7.3.3  默认参数    139
  • 7.3.4  可变参数    142
  • 7.3.5  组合参数    144
  • 7.4  执行流程    144
  • 7.5  形参和实参    145
  • 7.6  变量作用域    146
  • 7.6.1  局部变量    146
  • 7.6.2  全局变量    148
  • 7.7  有返回值和无返回值函数    150
  • 7.8  为什么要有函数    151
  • 7.9  返回函数    151
  • 7.10  递归函数    154
  • 7.11  匿名函数    156
  • 7.12  偏函数    159
  • 7.13  牛刀小试——经典排序之快速排序实现    159
  • 7.14  调试    161
  • 7.15  问题解答    161
  • 7.16  温故知新,学以致用    162
  • 第8章  面向对象编程    164
  • 8.1  理解面向对象    164
  • 8.1.1  什么是面向对象编程    164
  • 8.1.2  面向对象术语简介    164
  • 8.2  类的定义与使用    165
  • 8.2.1  类的定义    165
  • 8.2.2  类的使用    166
  • 8.3  深入类    167
  • 8.3.1  类的构造方法    167
  • 8.3.2  类的访问权限    171
  • 8.4  继承    175
  • 8.5  多态    178
  • 8.6  封装    181
  • 8.7  多重继承    182
  • 8.8  获取对象信息    184
  • 8.9  类的专有方法    187
  • 8.10  牛刀小试——出行建议    191
  • 8.11  调试    193
  • 8.12  问题解答    193
  • 8.13  温故知新,学以致用    194
  • 第9章  异常    196
  • 9.1  什么是异常    196
  • 9.2  异常处理    197
  • 9.3  抛出异常    198
  • 9.4  捕捉多个异常    199
  • 9.5  使用一个块捕捉多个异常    200
  • 9.6  捕捉对象    201
  • 9.7  全捕捉    201
  • 9.8  异常中的else    202
  • 9.9  自定义异常    203
  • 9.10  finally子句    204
  • 9.11  异常和函数    205
  • 9.12  牛刀小试——正常数和异常数    206
  • 9.13  bug的由来    208
  • 9.14  温故知新,学以致用    208
  • 第10章  日期和时间    210
  • 10.1  日期和时间    210
  • 10.1.1  时间戳    210
  • 10.1.2  时间格式化符号    211
  • 10.1.3  struct_time元组    212
  • 10.2  time模块    212
  • 10.2.1  time()函数    212
  • 10.2.2  localtime([secs])函数    213
  • 10.2.3  gmtime([secs])函数    213
  • 10.2.4  mktime(t)函数    214
  • 10.2.5  asctime([t])函数    214
  • 10.2.6  ctime([secs])函数    214
  • 10.2.7  sleep(secs)函数    215
  • 10.2.8  clock()函数    215
  • 10.2.9  strftime(format[, t])函数    216
  • 10.2.10  strptime(string[, format])函数    217
  • 10.2.11  三种时间格式转化    217
  • 10.3  datetime模块    217
  • 10.4  日历模块    221
  • 10.5  牛刀小试——时间大杂烩    222
  • 10.6  调试    226
  • 10.7  温故知新,学以致用    226
  • 第11章  正则表达式    228
  • 11.1  认识正则表达式    228
  • 11.2  re模块    230
  • 11.2.1  re.match函数    230
  • 11.2.2  re.search方法    231
  • 11.2.3  re.match与re.search的区别    231
  • 11.3  贪婪模式和非贪婪模式    232
  • 11.4  替换    233
  • 11.5  编译    234
  • 11.6  牛刀小试——匹配比较    234
  • 11.7  温故知新,学以致用    235
  • 第12章  文件操作    237
  • 12.1  打开文件    237
  • 12.1.1  文件模式    239
  • 12.1.2  缓存    239
  • 12.2  基本文件方法    240
  • 12.2.1  读和写    240
  • 12.2.2  读写行    243
  • 12.2.3  关闭文件    244
  • 12.2.4  文件重命名    245
  • 12.2.5  删除文件    246
  • 12.3  对文件内容进行迭代    246
  • 12.3.1  按字节处理    246
  • 12.3.2  按行操作    247
  • 12.3.3  使用fileinput实现懒加载式迭代    247
  • 12.3.4  文件迭代器    248
  • 12.4  StringIO函数    248
  • 12.5  序列化与反序列化    249
  • 12.5.1  一般序列化与反序列化    249
  • 12.5.2  JSON序列化与反序列化    250
  • 12.6    牛刀小试——批量更改文件名    252
  • 12.7  调试    253
  • 12.8  问题解答    254
  • 12.9  温故知新,学以致用    254
  • 第13章  多线程    256
  • 13.1  线程和进程    256
  • 13.1.1  进程    256
  • 13.1.2  线程    256
  • 13.1.3  多线程与多进程    257
  • 13.2  使用线程    258
  • 13.2.1  全局解释器锁    258
  • 13.2.2  退出线程    258
  • 13.2.3  Python的线程模块    259
  • 13.3  _thread模块    259
  • 13.4  threading模块    261
  • 13.5  线程同步    265
  • 13.6  线程优先级队列    267
  • 13.7  线程与进程比较    269
  • 13.7.1  线程切换    270
  • 13.7.2  计算密集型与IO密集型    270
  • 13.7.3  异步IO    271
  • 13.8  牛刀小试——多线程简单爬虫    271
  • 13.9  调试    272
  • 13.10  问题解答    273
  • 13.11  温故知新,学以致用    273
  • 第14章  发送和接收电子邮件    275
  • 14.1  电子邮件介绍    275
  • 14.2  发送邮件    277
  • 14.2.1  SMTP发送邮件    277
  • 14.2.2  发送HTML格式的邮件    279
  • 14.2.3  发送带附件的邮件    280
  • 14.2.4  发送图片    281
  • 14.2.5  同时支持HTML和Plain格式    282
  • 14.2.6  加密SMTP    284
  • 14.3  POP3接收邮件    284
  • 14.3.1  POP3下载邮件    285
  • 14.3.2  解析邮件    286
  • 14.4  牛刀小试——邮件发送通用化    287
  • 14.5  调试    290
  • 14.6  问题解答    290
  • 14.7  温故知新,学以致用    290
  • 第15章  网络编程    292
  • 15.1  初识网络编程    292
  • 15.2  TCP/IP简介    292
  • 15.3  网络设计模块    293
  • 15.3.1  Socket简介    294
  • 15.3.2  socket模块    294
  • 15.3.3  socket对象(内建)方法    296
  • 15.4  TCP编程    297
  • 15.4.1  客户端    297
  • 15.4.2  服务器编程    299
  • 15.5  UDP编程    303
  • 15.6  urllib模块    305
  • 15.6.1  GET请求    305
  • 15.6.2  POST请求    306
  • 15.7  牛刀小试——模拟浏览器    307
  • 15.8  调试    308
  • 15.9  问题解答    308
  • 15.10  温故知新,学以致用    308
  • 第16章  GUI编程    310
  • 16.1  GUI简介    310
  • 16.1.1  常用GUI库简介    310
  • 16.1.2  安装tkinter    311
  • 16.2  概念介绍    311
  • 16.2.1  窗口和控件    311
  • 16.2.2  事件驱动处理    312
  • 16.2.3  布局管理器    312
  • 16.3  Tk控件    312
  • 16.3.1  Button控件    313
  • 16.3.2  Checkbutton控件    314
  • 16.3.3  Label控件    315
  • 16.3.4  Text控件    316
  • 16.3.5  Menu控件    317
  • 16.4  tkinter 组合控件    319
  • 16.5  牛刀小试——计算器开发    320
  • 16.6  调试    325
  • 16.7  问题解答    325
  • 16.8  温故知新,学以致用    325
  • 第17章  操作数据库    327
  • 17.1  数据库介绍    327
  • 17.2  Python数据库API    328
  • 17.2.1  全局变量    328
  • 17.2.2  异常    329
  • 17.2.3  连接和游标    329
  • 17.2.4  类型    331
  • 17.3  数据库操作    331
  • 17.3.1  数据库连接    331
  • 17.3.2  创建数据库表    332
  • 17.3.3  数据库插入    333
  • 17.3.4  数据库查询    334
  • 17.3.5  数据库更新    335
  • 17.3.6  数据库删除    336
  • 17.4  事务    337
  • 17.5  调试    338
  • 17.6  问题解答    338
  • 17.7  温故知新,学以致用    339
  • 第18章  项目实战——爬虫    340
  • 18.1  了解爬虫    340
  • 18.2  爬虫的原理    341
  • 18.3  爬虫常用的几种技巧    341
  • 18.3.1  基本方法    341
  • 18.3.2  使用代理服务器    342
  • 18.3.3  Cookie处理    342
  • 18.3.4  伪装成浏览器    343
  • 18.3.5  登录    343
  • 18.4  爬虫示例——抓取豆瓣电影Top250影评数据    344
  • 18.4.1  确定URL格式    344
  • 18.4.2  页面抓取    344
  • 18.4.3  提取相关信息    345
  • 18.4.4  写入文件    346
  • 18.4.5  完善代码    346
  • 18.5  项目小结    349
  • 第19章  自然语言分词与词频统计    350
  • 19.1  概念介绍    350
  • 19.1.1  SQLAlchemy简介    350
  • 19.1.2  pyecharts简介    351
  • 19.1.3  jieba分词库简介    351
  • 19.1.4  BeautifulSoup库简介    351
  • 19.2  库的安装与使用    351
  • 19.2.1  SQLAlchemy的安装与使用    351
  • 19.2.2  pyecharts的安装与使用    352
  • 19.2.3  jieba分词库的安装与使用    353
  • 19.2.4  BeautifulSoup的安装与使用    354
  • 19.3  分词与词频统计实战    354
  • 19.3.1  整体结构设计    355
  • 19.3.2  数据结构设计    355
  • 19.3.3  数据的爬取与保存    356
  • 19.3.4  制定关键词库    358
  • 19.3.5  词频统计与图表生成    358
  • 19.4  分词与词频统计完整代码实现与结果查看    359
  • 19.5  项目小结    367
  • 第20章  区块链实战    368
  • 20.1  区块链简介    368
  • 20.1.1  区块链的定义    368
  • 20.1.2  区块链的特点    369
  • 20.1.3  区块链应用行业及领域    369
  • 20.2   区块链代码结构设计    369
  • 20.2.1  环境准备    369
  • 20.2.2  代码结构设计    369
  • 20.3  区块链具体逻辑实现    371
  • 20.3.1  块结构    371
  • 20.3.2  加入交易    372
  • 20.3.3  创建新块    372
  • 20.3.4  工作量证明的理解    374
  • 20.3.5  工作量证明的实现    374
  • 20.4  API接口层开发    375
  • 20.4.1  发送交易    375
  • 20.4.2  挖矿    376
  • 20.4.3  返回整个区块链    376
  • 20.5  运行区块链    377
  • 20.6  分布式实现    378
  • 20.6.1  注册节点    379
  • 20.6.2  实现共识算法    379
  • 20.7  完整项目代码与执行    381
  • 20.8  项目小结    393
  • 附录    394
  • A.1  数学函数    394
  • A.2  随机函数    394
  • A.3  三角函数    395
  • A.4  Python字符串内建函数    395
  • A.5  列表方法    397
  • A.6  字典内置方法    397
  • A.7  正则表达式模式    398

读书笔记

Python 3.7中dataclass装饰器用法详解

Python 3.7新功能之dataclass装饰器详解

前言

Python 3.7 将于今年夏天发布,Python 3.7 中将会有许多新东西:

  • 各种字符集的改进
  • 对注释的推迟评估
  • 以及对dataclass的支持

最激动人心的新功能之一是 dataclass 装饰器。

什么是 Data Class

大多数 Python 开发人员编写过很多像下面这样的类:

class MyClass:
 def __init__(self, var_a, var_b):
 self.var_a = var_a
 self.var_b = var_b

dataclass 可以为简单的情况自动生成方法,例如,一个__init__接受这些参数并将其分配给自己,之前的小例子可以重写为:

@dataclass
class MyClass:
 var_a: str
 var_b: str

那么通过一个例子来看看如何使用吧

星球大战 API

可以使用 requests 从星球大战 API 获取资源:

response = requests.get('https://swapi.co/api/films/1/')
dictionary = response.json()

让我们来看看 dictionary (简化过)的结果:

{
 'characters': ['https://swapi.co/api/people/1/',… ],
 'created': '2014-12-10T14:23:31.880000Z',
 'director': 'George Lucas',
 'edited': '2015-04-11T09:46:52.774897Z',
 'episode_id': 4,
 'opening_crawl': 'It is a period of civil war.\r\n … ',
 'planets': ['https://swapi.co/api/planets/2/', … ],
 'producer': 'Gary Kurtz, Rick McCallum',
 'release_date': '1977-05-25',
 'species': ['https://swapi.co/api/species/5/',…],
 'starships': ['https://swapi.co/api/starships/2/',…],
 'title': 'A New Hope',
 'url': 'https://swapi.co/api/films/1/',
 'vehicles': ['https://swapi.co/api/vehicles/4/',…]

封装 API

为了正确地封装一个 API,我们应该创建一个用户可以在其应用程序中使用的对象,因此,在Python 3.6 中定义一个对象来包含requests对 /films/endpoint的响应:

class StarWarsMovie:
 def __init__(self,
   title: str,
   episode_id: int,
   opening_crawl: str,
   director: str,
   producer: str,
   release_date: datetime,
   characters: List[str],
   planets: List[str],
   starships: List[str],
   vehicles: List[str],
   species: List[str],
   created: datetime,
   edited: datetime,
   url: str
   ):

 self.title = title
 self.episode_id = episode_id
 self.opening_crawl= opening_crawl
 self.director = director
 self.producer = producer
 self.release_date = release_date
 self.characters = characters
 self.planets = planets
 self.starships = starships
 self.vehicles = vehicles
 self.species = species
 self.created = created
 self.edited = edited
 self.url = url

 if type(self.release_date) is str:
  self.release_date = dateutil.parser.parse(self.release_date)

 if type(self.created) is str:
  self.created = dateutil.parser.parse(self.created)

 if type(self.edited) is str:
  self.edited = dateutil.parser.parse(self.edited)

仔细的读者可能已经注意到这里有一些重复的代码。

这是使用 dataclass 装饰器的经典案例,我们需要创建一个主要用来保存数据的类,只需一点验证,所以让我们来看看我们需要修改什么。

首先,data class 自动生成一些 dunder 方法,如果我们没有为 data class 装饰器指定任何选项,则生成的方法有:__init__,__eq__和__repr__,如果你已经定义了__repr__但没定义__str__,默认情况下 Python(不仅仅是 data class)将实现返回__repr__的输出__str__方法。因此,只需将代码更改为以下代码即可实现四种 dunder 方法:

@dataclass
class StarWarsMovie:
 title: str
 episode_id: int
 opening_crawl: str
 director: str
 producer: str
 release_date: datetime
 characters: List[str]
 planets: List[str]
 starships: List[str]
 vehicles: List[str]
 species: List[str]
 created: datetime
 edited: datetime
 url: str

我们去掉了__init__方法,以确保 data class 装饰器可以添加它生成的对应方法。不过,我们在这个过程中失去了一些功能,我们的 Python 3.6 构造函数不仅定义了所有的值,还试图解析日期,我们怎样才能用 data class 来做到这一点呢?

如果要覆盖 __init__,我们将失去 data class 的优势,因此,如果要处理任何附加功能可以使用新的 dunder 方法:__post_init__,让我们看看__post_init__方法对于我们的包装类来说是什么样子的:

def __post_init__(self):
 if type(self.release_date) is str:
  self.release_date = dateutil.parser.parse(self.release_date)

 if type(self.created) is str:
  self.created = dateutil.parser.parse(self.created)

 if type(self.edited) is str:
  self.edited = dateutil.parser.parse(self.edited)

就是这样! 我们可以使用 data class 装饰器在用三分之二的代码量实现我们的类。

更多好东西

通过使用装饰器的选项,可以为用例进一步定制 data class,默认选项是:

@dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False)
  • init决定是否生成__init__ dunder 方法
  • repr决定是否生成__repr__ dunder方法
  • eq对__eq__ dunder 方法也是如此,它决定相等性检查的行为(your_class_instance == another_instance)
  • order 实际上创建了四种 dunder 方法,它们确定所有检查小于,and/or,大于的行为,如果将其设置为 true,则可以对对象列表进行排序。

最后两个选项确定对象是否可以被哈希化,如果你想使用你的 class 的对象作为字典键的话,这是必要的。

更多信息请参考:PEP 557 -- Data Classes

python类装饰器用法实例

本文实例讲述了python类装饰器用法。分享给大家供大家参考。具体如下:

#!coding=utf-8 
registry = {} 
def register(cls): 
  registry[cls.__clsid__] = cls 
  return cls 
@register 
class Foo(object): 
  __clsid__ = '123-456' 
  def bar(self): 
    pass 
print registry 

运行结果如下:

{'123-456': <class '__main__.Foo'>}

希望本文所述对大家的Python程序设计有所帮助。

Python 使用类写装饰器的小技巧

最近学到了一个有趣的装饰器写法,就记录一下。

装饰器是一个返回函数的函数。写一个装饰器,除了最常见的在函数中定义函数以外,Python还允许使用类来定义一个装饰器。

1、用类写装饰器

下面用常见的写法实现了一个缓存装饰器。

def cache(func):
  data = {}
  def wrapper(*args, **kwargs):
    key = f'{func.__name__}-{str(args)}-{str(kwargs)})'
    if key in data:
      result = data.get(key)
      print('cached')
    else:
      result = func(*args, **kwargs)
      data[key] = result
      print('calculated')
    return result
  return wrapper

看看缓存的效果。

@cache
def rectangle_area(length, width):
  return length * width
rectangle_area(2, 3)
# calculated
# 6
rectangle_area(2, 3)
# cached
# 6

装饰器的@cache是一个语法糖,相当于func = cache(func),如果这里的cache不是一个函数,而是一个类又会怎样呢?定义一个类class Cache, 那么调用func = Cache(func)会得到一个对象,这时返回的func其实是Cache的对象。定义__call__方法可以将类的实例变成可调用对象,可以像调用函数一样调用对象。然后在__call__方法里调用原本的func函数就能实现装饰器了。所以Cache类也能当作装饰器使用,并且能以@Cache的形式使用。

接下来把cache函数改写为Cache类:

class Cache:
  def __init__(self, func):
    self.func = func
    self.data = {}
  def __call__(self, *args, **kwargs):
    func = self.func
    data = self.data
    key = f'{func.__name__}-{str(args)}-{str(kwargs)})'
    if key in data:
      result = data.get(key)
      print('cached')
    else:
      result = func(*args, **kwargs)
      data[key] = result
      print('calculated')
    return result

再看看缓存结果,效果一样。

@Cache
def rectangle_area(length, width):
  return length * width
rectangle_area(2, 3)
# calculated
# 6
rectangle_area(2, 3)
# cached
# 6

2、装饰类的方法

装饰器不止能装饰函数,也经常用来装饰类的方法,但是我发现用类写的装饰器不能直接用在装饰类的方法上。(有点绕…)

先看看函数写的装饰器如何装饰类的方法。

class Rectangle:
  def __init__(self, length, width):
    self.length = length
    self.width = width
  @cache
  def area(self):
    return self.length * self.width
r = Rectangle(2, 3)
r.area()
# calculated
# 6
r.area()
# cached
# 6

但是如果直接换成Cache类会报错,这个错误的原因是area被装饰后变成了类的一个属性,而不是方法。

class Rectangle:
  def __init__(self, length, width):
    self.length = length
    self.width = width
  @Cache
  def area(self):
    return self.length * self.width
r = Rectangle(2, 3)
r.area()
# TypeError: area() missing 1 required positional argument: 'self'
Rectangle.area
# <__main__.Cache object at 0x0000012D8E7A6D30>
r.area
# <__main__.Cache object at 0x0000012D8E7A6D30>

回头再来看看没有装饰器的情况,Python在实例化对象后把函数变成了方法。

class Rectangle:
  def __init__(self, length, width):
    self.length = length
    self.width = width

  def area(self):
    return self.length * self.width

Rectangle.area
# <function Rectangle.area at 0x0000012D8E7B28C8>
r = Rectangle(2, 3)
r.area
# <bound method Rectangle.area of <__main__.Rectangle object

因此解决办法很简单,要用类写的装饰器来装饰类的方法,只需要把可调用对象包装成函数就行。

# 定义一个简单的装饰器,什么也不做,仅仅是把可调用对象包装成函数
def method(call):
  def wrapper(*args, **kwargs):
    return call(*args, **kwargs)
  return wrapper
class Rectangle:
  def __init__(self, length, width):
    self.length = length
    self.width = width
  @method
  @Cache
  def area(self):
    return self.length * self.width
r = Rectangle(2, 3)
r.area()
# calculated
# 6
r.area()
# cached
# 6

或者用@property还能直接把方法变成属性。

class Rectangle:
  def __init__(self, length, width):
    self.length = length
    self.width = width
  @property
  @Cache
  def area(self):
    return self.length * self.width
r = Rectangle(2, 3)
r.area
# calculated
# 6
r.area
# cached
# 6

总结

用类写装饰器并非什么特别的技巧,一般情况下确实没必要这么写,不过这样就可以用一些类的特性来写装饰器,比如类的继承,也算是提供了另一种思路吧。

上一篇:没有了  下一篇:Python从小白到大牛

展开 +

收起 -

Python3.7 相关电子书
Python3.7 学习笔记
网友NO.485620

python3.7自带pip吗

在验证pip之前,首先确认你的python环境是否正常! python在python3.x以上的发行版本中,都是自带pip的。python3中的pip叫pip3,使用时要注意。 WIN +R 输入cmd,回车,打开命令行窗口,输入pip3 -V ,查看python版本 如下: 如果pip不是最新的版本,可在命令行中输入python -m pip install --upgrade pip来进行升级 以上就是python3.7自带pip吗的详细内容,更多请关注码农之家其它相关文章! ……

网友NO.321401

详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本

0.配置依赖环境,如果不进行这步可能会出现一些问题 中间可能有多余空格,去除下再运行,一般都能安装成功,如果不能可以先更新下sudo apt-get update sudo apt-get install zlib1g-dev libbz2-dev libssl-dev libncurses5-dev libsqlite3-dev libreadline-dev tk-dev libgdbm-dev libdb-dev libpcap-dev xz-utils libexpat1-dev liblzma-dev libffi-dev libc6-dev 1.直接去官网下载你想的版本 2.解压下载的包,在这之前你可以先mv你的包到指定位置解压 jianjiacheng@J-computer:~$ tar zxvf Python-3.7.1 3.进入解压目录 jianjiacheng@J-computer:~$ cd Python-3.7.1/ 4.建立安装的目录 sudo mkdir -p /usr/local/python3 5.编译安装 执行这步是后面最好加上 --enable-optimizations 会自动安装pip3及优化配置 # ./configure --prefix=/usr/local/python3 --enable-optimizations# make# sudo make install 6.删除软链接 先执行查看版本,如果有则证明软链接已存在,需要先删去以前的再重新建立 //这里表明我已有python3的软链接而没有pip3的软链接所以需要删除python3的软链接重新建立jianjiacheng@J-computer:~/Python-3.7.1$ python3 -VPython 3.5.2jianjiacheng@J-computer:~$ pip3 -Vbash: /usr/lib/command-not-found: /usr/bin/python3: bad interpreter: No such file or directory rm -rf /usr/bin/python3rm -rf /usr/bin/pip3 7.建立新的指向python3.7的软链接 #添加python3的软链接ln -s /usr/local/python3/bin/python3.7 /usr/bin/python3#添加 pip3 的软链……

网友NO.247052

Linux下python3.7.0安装教程

记录了Linux 安装python3.7.0的详细过程,供大家参考,具体内容如下 我这里使用的时centos7-mini,centos系统本身默认安装有python2.x,版本x根据不同版本系统有所不同,可通过 python --V 或 python --version 查看系统自带的python版本 有一些系统命令时需要用到python2,不能卸载 1、安装依赖包 1)首先安装gcc编译器,gcc有些系统版本已经默认安装,通过 gcc --version 查看,没安装的先安装gcc,yum -y install gcc 2)安装其它依赖包,(注:不要缺少,否则有可能安装python出错,python3.7.0以下的版本可不装 libffi-devel ) [code]yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel[/code 2、下载python3.7.0源码,根据需求下载 1)在https://www.python.org/ftp/python/中选择自己需要的python源码包,我下载的是python3.7.0 2)下载 wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz 3、解压Python-3.7.0.tgz tar -zxvf Python-3.7.0.tgz 4、建立一个空文件夹,用于存放python3程序 mkdir /usr/local/python3 5、执行配置文件,编译,编译安装 cd Python-3.7.0./configure --prefix=/usr/local/python3make make install 安装完成没有提示错误便安装成功了 6、建立软连接 ln -s /usr/local/python3/bin/python3.7 /usr/bin/python3ln -s /usr/local/python3/bin/pip3.7 /usr/bin/pip3 7、测试……

网友NO.470294

CentOS7下python3.7.0安装教程

记录了CentOS7 安装python3.7.0的详细过程,供大家参考,具体内容如下 1.下载及解压 python3.7的安装包可从官网下载上传到主机,也可以用wget直接下载。 [root@yuioplvlinux-130 ~]# cd /usr/local/src/[root@yuioplvlinux-130 src]# wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz[root@yuioplvlinux-130 src]# tar xvJf Python-3.7.0.tar.xz[root@yuioplvlinux-130 src]# mv Python-3.7.0 /usr/local/python-3.7[root@yuioplvlinux-130 src]# cd /usr/local/python-3.7/ 2.安装 安装之前,首先安装两个python依赖的包; [root@yuioplvlinux-130 python-3.7]# yum -y install zlib* libffi-devel 配置编辑参数; [root@yuioplvlinux-130 python-3.7]# ./configure --prefix=/usr/local/sbin/python-3.7 然后编译和安装:“make”、“make install”; 安装完成后,若出现以下两行,说明安装成功; Installing collected packages: setuptools, pip Successfully installed pip-10.0.1 setuptools-39.0.1 也可以用“echo $?”查看,结果为0说明安装成功; 然后就可以使用python3了。 [root@yuioplvlinux-130 python-3.7]# /usr/local/sbin/python-3.7/bin/python3Python 3.7.0 (default, Jul 21 2018, 13:45:48) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linuxType "help", "copyright", "credits" or "license" for more information. 可以看到,虽然成功安装了python3.7,但是执行起来命令特别长,可以把python命令指向到到python3。 首先查看python命令的绝对路径,可以看到它是……

小美女程序猿
小美女程序猿

兄弟连的书都不错尤其是关于python的,这本书讲的是最新的Python3.7非常的好,把以前区别与python3.5以及之前的版本细节都做了对比,适合python程序员的提高的对新版本的认识。

码小辫

码小辫 发起

资源
15
粉丝
22
喜欢
4162
评论
14

    Copyright 2018-2019 xz577.com 码农之家

    版权责任说明