当前位置:主页 > 计算机电子书 > 程序设计 > Python编程下载
Python核心编程

Python核心编程 PDF 超清第3版

  • 更新:2019-08-12
  • 大小:22.4 MB
  • 类别:Python编程
  • 作者:卫斯理
  • 出版:人民邮电出版社
  • 格式:PDF

  • 资源介绍
  • 相关推荐

Python核心编程 PDF

全方位包含现如今应用程序开发中的诸多行业为初级Python开发者出示优秀实践活动方式包含很多好用的编码实例每章结尾的练习题有利于推进所教专业知识

想全面提高Python编程水准?请详细分析真實手机应用程序中应用的很多有关主题风格包含了正则表达式、Internet/网络编程、GUI、SQL/数据库查询/ORM、多核、Web开发设计掌握当今的开发设计地区,例如Google 、Twitter、MongoDB、OAuth、Python 3转移、Java/Jython包揽相关Django、Google App Engine、CSV/JSON/XML和Microsoft Office的全新升级內容。包括Python 2和Python 3编码,便于马上能够 应用出示了编码片断、互动交流实例和好用训练,致力于推进Python专业技能

Python是这种灵便、靠谱且具备感染力的计算机语言,它将编译语言的强劲与开发语言的形象性、迅速开发设计特点融合起來。在《Python核心编程 第3版》中,优秀Python开发者兼企业培训师Wesley Chun会协助您将Python专业技能提高到更高的水准。《Python核心编程 第3版》包含了变成一位技术性全方位的Python开发者需要的任何內容。《Python核心编程 第3版》解读了应用程序开发有关的好几个行业,并且书中的內容能够 马上运用到新项目开发设计中。除此之外,《Python核心编程 第3版》还包括了某些应用Python 2和Python 3撰写的编码实例,及其某些编码移殖方法。一些编码片断乃至不必改动就能够 运作在Python 2.x或Python 3.x上。

《Python核心编程 第3版》解读了给出內容:学习培训技术专业的Python设计风格、优秀实践活动及其好的编程习惯性;应用TCP、UDP、XML-RPC来开发设计手机客户端和网络服务器,并供高級的库(例如SocketServer和Twisted)应用应用Tkinter和别的能用的小工具来开发设计GUI运用;根据应用C/C 撰写拓展,或是应用多核来撰写I/O劳动密集型编码,提高运用的特性;研究QSL和关系数据库、ORM,乃至是MongoDB那样的非关系型(NonSQL)数据库查询;学习培训Web编程的基本知识,包含Web手机客户端和网络服务器,及其CGI和WSGI;应用正则表达式和强劲的文本处理小工具,来建立和分析CSV、JSON和XML统计数据;应用COM手机客户端编程与普遍的Microsoft Office手机软件(例如Excel、PowerPoint、Outlook)开展互动;应用Django架构深层次掌握Web开发设计,及其应用Google App Engine深层次掌握云计算技术;应用Jyhon探寻Java编程,及其在JVM上运作Python编码的方法;联接Web服务项目,例如联接Yahoo!Fiance获得股票行情,或是联接Yahoo!Mail、Gmail及其别的邮件服务器来免费下载或发送邮件;根据学习培训怎样联接Twitter和Google 互联网来相拥网络媒介的风潮。

《Python核心编程(第3版)》是經典畅销图书《Python核心编程(其次版)》的升级版版本号,一共分成3一部分。第1一部分为解读了Python的某些通用性运用,包含正则表达式、网络编程、Internet手机客户端编程、多线程编程、GUI编程、数据库查询编程、Microsoft Office编程、拓展Python等內容。第2一部分解读了与Web开发设计有关的主题风格,包含Web手机客户端和网络服务器、CGI和WSGI有关的Web编程、Django Web架构、云计算技术、高級Web服务项目。第3一部分则为1个填补/试验章节目录,包含文本处理及其某些别的內容。 《Python核心编程(第3版)》合适具备必须工作经验的Python开发者阅读文章。

目录

  • 第1部分  通用应用主题
  • 第1章 正则表达式 2
  • 1.1 简介/动机 3
  • 1.2 特殊符号和字符 5
  • 1.2.1 使用择一匹配符号匹配多个正则表达式模式 6
  • 1.2.2 匹配任意单个字符 6
  • 1.2.3 从字符串起始或者结尾或者单词边界匹配 7
  • 1.2.4 创建字符集 8
  • 1.2.5 限定范围和否定 8
  • 1.2.6 使用闭包操作符实现存在性和频数匹配 9
  • 1.2.7 表示字符集的特殊字符 10
  • 1.2.8 使用圆括号指定分组 10
  • 1.2.9 扩展表示法 11
  • 1.3 正则表达式和Python语言 11
  • 1.3.1 re模块:核心函数和方法 12
  •  1.3.2 使用compile()函数编译正则表达式 13
  • 1.3.3 匹配对象以及group()和groups()方法 14
  • 1.3.4 使用match()方法匹配字符串 14
  • 1.3.5 使用search()在一个字符串中查找模式(搜索与匹配的对比) 15
  • 1.3.6 匹配多个字符串 16
  • 1.3.7 匹配任何单个字符(.) 16
  • 1.3.8 创建字符集([ ]) 17
  • 1.3.9 重复、特殊字符以及分组 18
  • 1.3.10 匹配字符串的起始和结尾以及单词边界 20
  • 1.3.11 使用findall()和finditer()查找每一次出现的位置 21
  • 1.3.12 使用sub()和subn()搜索与替换 22
  • 1.3.13 在限定模式上使用split()分隔字符串 23
  • 1.3.14 扩展符号 24
  • 1.3.15 杂项 27
  •  1.4 一些正则表达式示例 28
  • 1.5 更长的正则表达式示例 33
  • 1.5.1 匹配字符串 35
  • 1.5.2 搜索与匹配……还有贪婪 37
  • 1.6 练习 39
  • 第2章 网络编程 42
  • 2.1 简介 43
  • 2.2 客户端/服务器架构 43
  • 2.2.1 硬件客户端/服务器架构 43
  • 2.2.2 软件客户端/服务器架构 44
  • 2.2.3 银行出纳员作为服务器吗 44
  • 2.2.4 客户端/服务器网络编程 45
  • 2.3 套接字:通信端点 46
  • 2.3.1 套接字 46
  • 2.3.2 套接字地址:主机-端口对 47
  • 2.3.3 面向连接的套接字与无连接的套接字 47
  • 2.4 Python中的网络编程 48
  • 2.4.1 socket()模块函数 49
  • 2.4.2 套接字对象(内置)方法 49
  • 2.4.3 创建TCP服务器 51
  • 2.4.4 创建TCP客户端 54
  • 2.4.5 执行TCP服务器和客户端 56
  • 2.4.6 创建UDP服务器 58
  • 2.4.7 创建UDP客户端 59
  • 2.4.8 执行UDP服务器和客户端 60
  • 2.4.9 socket模块属性 61
  • 2.5 *SocketServer模块 62
  • 2.5.1 创建SocketServer TCP服务器 63
  • 2.5.2 创建SocketServer TCP客户端 64
  • 2.5.3 执行TCP服务器和客户端 65
  • 2.6 *Twisted框架介绍 66
  • 2.6.1 创建Twisted ReactorTCP服务器 66
  • 2.6.2 创建Twisted ReactorTCP客户端 67
  • 2.6.3 执行TCP服务器和客户端 69
  • 2.7 相关模块 69
  • 2.8 练习 70
  • 第3章 因特网客户端编程 74
  • 3.1 因特网客户端简介 75
  • 3.2 文件传输 75
  • 3.2.1 文件传输因特网协议 75
  • 3.2.2 文件传输协议 76
  • 3.2.3 Python和FTP 77
  • 3.2.4 ftplib.FTP类的方法 77
  • 3.2.5 交互式FTP示例 78
  • 3.2.6 客户端FTP程序示例 79
  • 3.2.7 FTP的其他内容 80
  • 3.3 网络新闻 81
  • 3.3.1 Usenet与新闻组 81
  • 3.3.2 网络新闻传输协议 82
  • 3.3.3 Python和NNTP 83
  • 3.3.4 nntplib.NNTP类方法 83
  • 3.3.5 交互式NNTP示例 84
  • 3.3.6 客户端程序NNTP示例 85
  • 3.3.7 NNTP的其他内容 89
  • 3.4 电子邮件 90
  • 3.4.1 电子邮件系统组件和协议 90
  • 3.4.2 发送电子邮件 91
  • 3.4.3 Python和SMTP 92
  • 3.4.4 smtplib.SMTP类方法 92
  • 3.4.5 交互式SMTP示例 93
  • 3.4.6 SMTP的其他内容 94
  • 3.4.7 接收电子邮件 94
  • 3.4.8 POP和IMAP 95
  • 3.4.9 Python和POP3 95
  • 3.4.10 交互式POP3示例 96
  • 3.4.11 poplib.POP3类方法 97
  • 3.4.12 客户端程序SMTP和POP3示例 98
  • 3.4.13 Python和IMAP4 100
  • 3.4.14 交互式IMAP4示例 100
  • 3.4.15 imaplib.IMAP4类中的常用方法 101
  • 3.5 实战 102
  • 3.5.1 生成电子邮件 102
  • 3.5.2 解析电子邮件 104
  • 3.5.3 基于Web的云电子邮件服务 105
  • 3.5.4 最佳实践:安全、重构 106
  • 3.5.5 Yahoo! Mail 108
  • 3.5.6 Gmail 112
  • 3.6 相关模块 115
  • 3.6.1 电子邮件 115
  • 3.6.2 其他因特网客户端协议 115
  • 3.7 练习 116
  • 第4章 多线程编程 122
  • 4.1 简介/动机 123
  • 4.2 线程和进程 124
  • 4.2.1 进程 124
  • 4.2.2 线程 124
  • 4.3 线程和Python 125
  • 4.3.1 全局解释器锁 125
  • 4.3.2 退出线程 126
  • 4.3.3 在Python中使用线程 126
  • 4.3.4 不使用线程的情况 126
  • 4.3.5 Python的threading模块 128
  • 4.4 thread模块 128
  • 4.5 threading模块 132
  • 4.5.1 Thread类 133
  • 4.5.2 threading模块的其他函数 139
  • 4.6 单线程和多线程执行对比 140
  • 4.7 多线程实践 142
  • 4.7.1 图书排名示例 142
  • 4.7.2 同步原语 149
  • 4.7.3 锁示例 149
  • 4.7.4 信号量示例 156
  • 4.8 生产者-消费者问题和Queue/queue模块 159
  • 4.9 线程的替代方案 162
  • 4.9.1 subprocess模块 163
  • 4.9.2 multiprocessing模块 163
  • 4.9.3 concurrent.futures模块 163
  • 4.10 相关模块 165
  • 4.11 练习 165
  • 第5章 GUI编程 168
  • 5.1 简介 169
  • 5.1.1 Tcl、Tk和Tkinter 169
  • 5.1.2 安装和使用Tkinter 170
  • 5.1.3 客户端/服务端架构 170
  • 5.2 Tkinter和Python编程 170
  • 5.2.1 Tkinter模块:添加Tk到应用中 171
  • 5.2.2 GUI编程介绍 171
  • 5.2.3 顶层窗口:Tkinter.Tk() 173
  • 5.2.4 Tk控件 173
  • 5.3 Tkinter示例 174
  • 5.3.1 Label控件 174
  • 5.3.2 Button控件 175
  • 5.3.3 Label和Button控件 175
  • 5.3.4 Label、Button和Scale控件 176
  • 5.3.5 偏函数应用示例 178
  • 5.3.6 中级Tkinter示例 180
  • 5.4 其他GUI简介 185
  • 5.4.1 Tk接口扩展(Tix) 187
  • 5.4.2 Python MegaWidgets(PMW) 188
  • 5.4.3 wxWidgets和wxPython 188
  • 5.4.4 GTK 和PyGTK 190
  • 5.4.5 Tile/Ttk 192
  • 5.5 相关模块和其他GUI 194
  • 5.6 练习 196
  • 第6章 数据库编程 198
  • 6.1 简介 199
  • 6.1.1 持久化存储 199
  • 6.1.2 数据库基本操作和SQL 199
  • 6.1.3 数据库和Python 201
  • 6.2 Python的DB-API 203
  • 6.2.1 模块属性 203
  • 6.2.2 Connection对象 205
  • 6.2.3 Cursor对象 206
  • 6.2.4 类型对象和构造函数 207
  • 6.2.5 关系数据库 209
  • 6.2.6 数据库和Python:适配器 210
  • 6.2.7 使用数据库适配器的示例 210
  • 6.2.8 数据库适配器示例应用 215
  • 6.3 ORM 226
  • 6.3.1 考虑对象,而不是SQL 227
  • 6.3.2 Python和ORM 227
  • 6.3.3 员工角色数据库示例 228
  • 6.3.4 SQLAlchemy 229
  • 6.3.5 SQLObject 240
  • 6.4 非关系数据库 245
  • 6.4.1 NoSQL介绍 245
  • 6.4.2 MongoDB 246
  • 6.4.3 PyMongo:MongoDB和Python 246
  • 6.4.4 总结 250
  • 6.5 相关文献 250
  • 6.6 练习 252
  • 第7章 *Microsoft Office编程 256
  • 7.1 简介 257
  • 7.2 使用Python进行COM客户端编程 257
  • 7.2.1 客户端COM编程 258
  • 7.2.2 入门 258
  • 7.3 入门示例 259
  • 7.3.1 Excel 259
  • 7.3.2 Word 261
  • 7.3.3 PowerPoint 262
  • 7.3.4 Outlook 264
  • 7.4 中级示例 266
  • 7.4.1 Excel 266
  • 7.4.2 Outlook 268
  • 7.4.3 PowerPoint 273
  • 7.4.4 总结 280
  • 7.5 相关模块/包 281
  • 7.6 练习 281
  • 第8章 扩展Python 286
  • 8.1 简介和动机 287
  • 8.1.1 Python扩展简介 287
  • 8.1.2 什么情况下需要扩展Python 288
  • 8.1.3 什么情况下不应该扩展Python 288
  • 8.2 编写Python扩展 289
  • 8.2.1 创建应用代码 289
  • 8.2.2 根据样板编写封装代码 291
  • 8.2.3 编译 296
  • 8.2.4 导入并测试 297
  • 8.2.5 引用计数 300
  • 8.2.6 线程和全局解释器锁 301
  • 8.3 相关主题 302
  • 8.3.1 SWIG 302
  • 8.3.2 Pyrex 302
  • 8.3.3 Cython 302
  • 8.3.4 Psyco 303
  • 8.3.5 PyPy 303
  • 8.3.6 嵌入Python 304
  • 8.4 练习 304
  •  
  • 第2部分 Web开发
  •  
  • 第9章 Web客户端和服务器 306
  • 9.1 简介 307
  • 9.1.1 Web应用:客户端/服务器计算 307
  • 9.1.2 因特网 308
  • 9.2 Python Web客户端工具 310
  • 9.2.1 统一资源定位符 310
  • 9.2.2 urlparse模块 312
  • 9.2.3 urllib模块/包 313
  • 9.2.4 使用urllib2 HTTP验证的示例 317
  • 9.2.5 将HTTP验证示例移植到Python3中 319
  • 9.3 Web客户端 322
  • 9.3.1 一个简单的Web爬虫/蜘蛛/机器人 322
  • 9.3.2 解析Web页面 328
  • 9.3.3 可编程的Web浏览 333
  • 9.4 Web(HTTP)服务器 336
  • 9.5 相关模块 339
  • 9.6 练习 341
  • 第10章 Web编程:CGI和WSGI 345
  • 10.1 简介 346
  • 10.2 帮助Web服务器处理客户端数据 346
  • 10.2.1 CGI简介 346
  • 10.2.2 CGI应用程序 347
  • 10.2.3 cgi模块 348
  • 10.2.4 cgitb模块 348
  • 10.3 构建CGI应用程序 349
  • 10.3.1 构建Web服务器 349
  • 10.3.2 建立表单页 351
  • 10.3.3 生成结果页面 352
  • 10.3.4 生成表单和结果页面 353
  • 10.3.5 全面交互的Web站点 357
  • 10.4 在CGI中使用Unicode 362
  • 10.5 高级CGI 364
  • 10.5.1 mulitipart表单提交和文件上传 364
  • 10.5.2 多值字段 364
  • 10.5.3 cookie 365
  • 10.5.4 cookie和文件上传 365
  • 10.6 WSGI简介 373
  • 10.6.1 动机(替代CGI) 373
  • 10.6.2 服务器集成 374
  • 10.6.3 外部进程 374
  • 10.6.4 WSGI简介 375
  • 10.6.5 WSGI服务器 376
  • 10.6.6 参考服务器 377
  • 10.6.7 WSGI应用示例 378
  • 10.6.8 中间件及封装WSGI应用 378
  • 10.6.9 在Python 3中使用WSGI 379
  • 10.7 现实世界中的Web开发 380
  • 10.8 相关模块 380
  • 10.9 练习 381
  • 第11章 Web框架:Django 384
  • 11.1 简介 385
  • 11.2 Web框架 385
  • 11.3 Django简介 386
  • 11.4 项目和应用 390
  • 11.4.1 在Django中创建项目 390
  • 11.4.2 运行开发服务器 393
  • 11.5 “Hello World”应用(一个博客) 394
  • 11.6 创建模型来添加数据库服务 396
  • 11.6.1 设置数据库 396
  • 11.6.2 创建表 398
  • 11.7 Python 应用shell 400
  • 11.7.1 在Django中使用Pythonshell 400
  • 11.7.2 测试数据模型 402
  • 11.8 Django管理应用 403
  • 11.8.1 设置admin 403
  • 11.8.2 使用admin 404
  • 11.9 创建博客的用户界面 410
  • 11.9.1 创建模板 411
  • 11.9.2 创建URL模式 412
  • 11.9.3 创建视图函数 415
  • 11.10 改进输出 418
  • 11.11 处理用户输入 422
  • 11.11.1 模板:添加HTML表单 423
  • 11.11.2 添加URLconf项 423
  • 11.11.3 视图:处理用户输入 423
  • 11.11.4 跨站点请求伪造 424
  • 11.12 表单和模型表单 426
  • 11.12.1 Django表单简介 426
  • 11.12.2 模型表单示例 427
  • 11.12.3 使用ModelForm来生成HTML表单 427
  • 11.12.4 处理ModelForm数据 428
  • 11.13 视图进阶 429
  • 11.14 *改善外观 431
  • 11.15 *单元测试 432
  • 11.15.1 blog应用的代码审查 434
  • 11.15.2 blog应用总结 439
  • 11.16 *中级Django应用:TweetApprover 439
  • 11.16.1 创建项目文件结构 440
  • 11.16.2 安装Twython库 445
  • 11.16.3 URL结构 446
  • 11.16.4 数据模型 449
  • 11.16.5 提交新推文以便审核 453
  • 11.16.6 审核推文 457
  • 11.17 资源 465
  • 11.18 总结 465
  • 11.19 练习 466
  • 第12章 云计算:Google App Engine 470
  • 12.1 简介 471
  • 12.2 云计算 471
  • 12.2.1 云计算服务的层次 472
  • 12.2.2 App Engine 473
  • 12.3 沙盒和App Engine SDK 476
  • 12.4 选择一个App Engine框架 479
  • 12.5 Python 2.7支持 485
  • 12.5.1 一般差异 486
  • 12.5.2 代码中的差异 486
  • 12.6 与Django比较 487
  • 12.6.1 开始“Hello World” 487
  • 12.6.2 手动创建“Hello World”(Zip文件用户) 488
  • 12.7 将“Hello World”改成一个 简单的博客 489
  • 12.7.1 快速发现改动:30秒内将纯文本转成HTML 489
  • 12.7.2 添加表单 490
  • 12.7.3 添加Datastore服务 492
  • 12.7.4 迭代改进 496
  • 12.7.5 开发/SDK控制台 496
  • 12.8 添加Memcache服务 502
  • 12.9 静态文件 505
  • 12.10 添加用户服务 505
  • 12.10.1 Google账号验证 506
  • 12.10.2 联合验证 507
  • 12.11 远程API shell 507
  • 12.12 问与答(Python实现) 509
  • 12.12.1 发送电子邮件 509
  • 12.12.2 接收电子邮件 510
  • 12.13 使用XMPP发送即时消息 512
  • 12.14 处理图片 514
  • 12.15 任务队列(非定期任务) 514
  • 12.15.1 创建任务 515
  • 12.15.2 配置app.yaml 515
  • 12.15.3 其他任务创建选项 516
  • 12.15.4 将发送电子邮件作为任务 517
  • 12.15.5 deferred包 519
  • 12.16 使用Appstats进行分析 520
  • 12.16.1 在app.yaml中添加标准处理程序 521
  • 12.16.2 添加自定义Admin Console页面 521
  • 12.16.3 作为内置界面启用界面 521
  • 12.17 URLfetch服务 522
  • 12.18 问与答(无Python实现) 522
  • 12.18.1 Cron服务(计划任务作业) 523
  • 12.18.2 预热请求 523
  • 12.18.3 DoS保护 524
  • 12.19 厂商锁定 524
  • 12.20 资源 525
  • 12.21 总结 526
  • 12.22 练习 527
  • 第13章 Web服务 530
  • 13.1 简介 531
  • 13.2 Yahoo!金融股票报价服务器 531
  • 13.3 Twitter微博 534
  • 13.3.1 社交网络 534
  • 13.3.2 Twitter和Python 535
  • 13.3.3 稍微长一点的API组合应用示例 537
  • 13.3.4 总结 547
  • 13.3.5 额外在线资源 548
  • 13.4 练习 548
  •  
  • 第3部分 补充/实验章节
  •  
  • 第14章 文本处理 553
  • 14.1 逗号分隔值(CSV) 554
  • 14.1.1 CSV简介 554
  • 14.1.2 再论股票投资组合示例 556
  • 14.2 JSON 557
  • 14.3 可扩展标记语言 561
  • 14.3.1 XML简介 562
  • 14.3.2 Python和XML 562
  • 14.3.3 XML实战 566
  • 14.3.4 *使用XML-RPC的客户端-服务器服务 569
  • 14.4 参考文献 573
  • 14.5 相关模块 574
  • 14.6 练习 574
  • 第15章 其他内容 577
  • 15.1 Jython 578
  • 15.1.1 Jython简介 578
  • 15.1.2 Swing GUI开发示例 579
  • 15.2 Google  581
  • 15.2.1 Google 平台简介 582
  • 15.2.2 Python和Google API 582
  • 15.2.3 一个简单的社交媒体分析工具 582
  • 15.3 练习 590
  • 附录A 部分练习参考答案 593
  • 附录B 参考表 597
  • B.1 Python关键字 597
  • B.2 Python标准操作符和函数 598
  • B.3 数值类型操作符和函数 599
  • B.4 序列类型操作符和函数 600
  • B.5 字符串格式化操作符转换符号 602
  • B.6 字符串格式化操作符指令 603
  • B.7 字符串类型内置方法 603
  • B.8 列表类型内置方法 605
  • B.9 字典类型内置方法 605
  • B.10 集合类型操作符和内置函数 606
  • B.11 文件对象方法和数据属性 607
  • B.12 Python异常 608
  • B.13 类的特殊方法 610
  • B.14 Python操作符汇总 612
  • 附录C Python 3:一种编程语言进化的产物 614
  • C.1 为何Python在变化 614
  • C.2 都发生了哪些变化 615
  • C.2.1 print变成了print() 615
  • C.2.2 字符串:默认为Unicode编码 616
  • C.2.3 单类类型 616
  • C.2.4 更新异常的语法 617
  • C.2.5 整数的更新 618
  • C.2.6 迭代器无处不在 619
  • C.3 迁移工具 619
  • C.3.1 2to3工具 619
  • C.3.2 Python 2.6  620
  • C.4 结论 620
  • C.5 参考资料 620
  • 附录D 利用Python 2.6 向Python 3迁移 622
  • D.1 Python 3:Python的下一代 622
  • D.2 整数 623
  • D.2.1 单整数类型 624
  • D.2.2 新型二进制和改进的八进制字符 624
  • D.2.3 经典除法或真除法 625
  • D.3 内置函数 626
  • D.3.1 print语句或print()函数 626
  • D.3.2 reduce()转移到了functools模块中 627
  • D.3.3 其他更新 627
  • D.4 面向对象编程:两种不同的类对象 628
  • D.5 字符串 629
  • D.6 异常 630
  • D.6.1 处理异常(使用as) 630
  • D.6.2 抛出异常 630
  • D.7 其他转换工具和技巧 631
  • D.8 编写兼容版本2.x和3.x的代码 632
  • D.8.1 对比print和print() 632
  • D.8.2 将你的方法导入解决方案中 633
  • D.8.3 整合在一起 634
  • D.9 结论 635

资源下载

资源下载地址1:https://pan.baidu.com/s/1rghyL4umd9APLECu-aN7dA

相关资源

网友留言