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

码小辫 提供上传

资源
50
粉丝
48
喜欢
2962
评论
19

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

    Python3.7电子书
    • 发布时间:

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

  • Python3.7从零开始学 PDF 下载
  • 下载地址:https://pan.baidu.com/s/1-iHTw0e42GW4L-nyZc17OgZ
  • 分享码:5
  • 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

    总结

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

    上一篇:疯狂Java讲义精粹  下一篇:Python新手使用Django架站的16堂课

    展开 +

    收起 -

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

    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.309509

    详解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.647970

    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.522424

    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程序员的提高的对新版本的认识。

    Copyright 2018-2019 xz577.com 码农之家

    版权责任说明