跳至主要内容

python 知识点详解


谷歌 Python 风格指南




命令行神器

Click 是用 Python 写的一个第三方模块,用于快速创建命令行。我们知道,Python 内置了一个 Argparse 的标准库用于创建命令行,但使用起来有些繁琐,Click 相比于 Argparse,就好比 requests 相比于 urllib。
https://click.palletsprojects.com/en/8.0.x/
https://www.huaweicloud.com/articles/7a04947e36af482218c5be9fc40b3a02.html

Python Fire 是一个用于从绝对任何 Python 对象自动生成命令行界面 (CLI) 的库。
https://github.com/google/python-fire



windows上不支持

python -m webbrowser -t "https://www.google.com"
python -m webbrowser -t "https://www.dylanroy.com"
python -m webbrowser -t "https://www.usesql.com"

https://github.com/Anorov/cloudflare-scrape
一个简单的 Python 模块,用于绕过 Cloudflare 的反机器人页面


使用newspaper3k框架快速抓取文章信息它使您可以从一系列领先的国际出版物中检索新闻文章和相关的元数据。您可以检索图像、文本和作者姓名。
因此,如果您正在考虑在下一个项目中使用 BeautifulSoup 或其他一些 DIY 网页抓取库,请为自己节省时间和精力
        但是报纸框架不适合实际工程新闻爬取,框架不稳定,爬取过程有各种bug,比如无法获取url、新闻信息,但是想获取一些新闻语料的朋友不妨一试,简单方便好用,不需要掌握太多爬虫知识。
$ pip install newspaper3k
https://www.codestudyblog.com/cnb11/1124174732.html


wikipedia维基百科有一个很棒的 AP​​I,它允许用户以编程方式访问无与伦比的完全免费的知识和信息
https://wikipedia.readthedocs.io/en/latest/quickstart.html
import wikipedia
result = wikipedia.page('freeCodeCamp')
print(result.summary)
for link in result.links:
    print(link)

YAML 代表“YAML 不是标记语言”。它是一种数据格式化语言,是 JSON 的超集
与 JSON 不同,它可以存储更复杂的对象并引用它自己的元素。您还可以编写注释,使其特别适合编写配置文件

从 python.org 下载 Python 最新版本


# python2
import sys
print sys.getdefaultencoding()
>>> ascii


# python3
import sys
print(sys.getdefaultencoding())
>>> utf-8


# 打印导入模块的文件路径。
import os 
import socket 
  
print(os)    # <module 'os' from 'C:\\Python38\\lib\\os.py'>
print(socket)    # <module 'socket' from 'C:\\Python38\\lib\\socket.py'>



Some changes in Python 3.0:

  • Print is now a function
  • Views and iterators instead of lists
  • The rules for ordering comparisons have been simplified. E.g. a heterogeneous list cannot be sorted, because all the elements of a list must be comparable to each other.
  • There is only one integer type left, i.e. int. long is int as well.
  • The division of two integers returns a float instead of an integer. "//" can be used to have the "old" behaviour.
  • Text Vs. Data Instead Of Unicode Vs. 8-bit

                     最有用的 Python 库?

1. Requests . 由 kenneth reitz 编写的最著名的 http 库。它是每个 Python 开发人员的必备工具。
    Requests允许您非常轻松地发送 HTTP/1.1 请求。无需手动向 URL 添加查询字符串,或对 POST 数据进行表单编码。多亏了urllib3,Keep-alive 和 HTTP 连接池是 100% 自动的

2. Scrapy . 如果您参与网页抓取,那么这是您必备的 库。使用此库后,您将不再使用任何其他库。
    一个开源协作框架,用于从网站中提取您需要的数据。以一种快速、简单但可扩展的方式。

3. wxPython . python的gui工具包。我主要用它来代替 tkinter。你会真的很喜欢它。
    它是 Python 语言的跨平台 GUI 工具包。使用 wxPython 软件开发人员可以为他们的 Python 应用程序创建真正的本机用户界面,这些界面在 Windows、Mac 和 Linux 或其他类 Unix 系统上几乎不需要修改即可运行。

4. Pillow . PIL(Python 成像库)的友好分支。它比 PIL 更用户友好,是任何处理图像的人的必备品。
    PIL 是 Python 图像库

5. SQLAlchemy .一个数据库库。许多人喜欢它,也有许多人讨厌它。这是你的选择。
    SQLAlchemy 是 Python SQL 工具包和对象关系映射器,可为应用程序开发人员提供 SQL 的全部功能和灵活性。

6. BeautifulSoup. 我知道它很慢但是这个 xml 和 html 解析库对初学者非常有用。
    Beautiful Soup 是一个 Python 库,专为快速周转项目(如屏幕抓取)而设计。三大特点使其功能强大:
  1. Beautiful Soup 提供了一些用于导航、搜索和修改解析树的简单方法和 Pythonic 习惯用法:一个用于剖析文档并提取所需内容的工具包。编写应用程序不需要太多代码
  2. Beautiful Soup 自动将传入文档转换为 Unicode,将传出文档转换为 UTF-8。您不必考虑编码,除非文档未指定编码并且 Beautiful Soup 无法检测到编码。然后你只需要指定原始编码。
  3. Beautiful Soup 位于流行的 Python 解析器(如lxmlhtml5lib )之上,允许您尝试不同的解析策略或以速度换取灵活性。

Beautiful Soup 会解析您提供的任何内容,并为您执行树遍历操作。您可以告诉它“查找所有链接”,或“查找类externalLink 的所有链接”,或“查找所有 url 与“foo.com”匹配的链接,或“查找带有粗体文本的表标题,然后给出我那个文本。”

7. Twisted. 任何网络应用程序开发人员最重要的工具。它有一个非常漂亮的 api,被很多著名的 Python 开发人员使用。
    Twisted是一个事件驱动的网络编程框架,它使用编程语言Python编写,并在MIT协议下开源。Twisted计划多方面的支持TCP、UDP、SSL/TLS、IP多播、Unix域套接字,很多协议(包括HTTP、XMPP、NNTP、IMAP、SSH、IRC、FTP等等)和很多其他东西。Twisted基于了事件驱动编程范型,这意味着Twisted的用户要书写由这个框架调用的短小回调函数

8. NumPy . 我们怎么能离开这个非常重要的 库?它为 Python 提供了一些高级数学功能。
    使用 Python 进行科学计算的基本包

9. SciPy . 当我们谈论 NumPy 时,我们必须谈论 scipy。它是一个用于 Python 的算法和数学工具库,并导致许多科学家从 ruby​​ 转向 Python。
    SciPy(发音为“Sigh Pie”)是一个基于 Python 的开源软件生态系统,用于数学、科学和工程

10. matplotlib . 一个数字绘图库。它对任何数据科学家或任何数据分析器都非常有用。
    Matplotlib 是一个综合性的库,用于在 Python 中创建静态、动画和交互式可视化

11. Pygame .哪个开发者不喜欢玩游戏并开发它们?该库将帮助您实现 2d 游戏开发的目标。
    Pygame是一组专为编写视频游戏而设计Python模块。Pygame 在优秀的SDL之上添加了功能这允许您使用 python 语言创建功能齐全的游戏和多媒体程序。

12. Pyglet. 一个 3d 动画和游戏创建引擎。这是我的世界著名的python端口的引擎
    pyglet是一个功能强大且易于使用的 Python 库,用于在 Windows、Mac OS X 和 Linux 上开发游戏和其他视觉丰富的应用程序。它支持窗口化、用户界面事件处理、操纵杆、OpenGL 图形、加载图像和视频以及播放声音和音乐。所有这一切都通过友好的 Pythonic API 实现,学习起来很简单,而且不会妨碍您。

13. pyQT. python的GUI工具包。这是我在 wxpython 之后为我的 Python 脚本开发 GUI 的第二选择。
    PyQt 是Qt 公司Qt 应用程序框架的一组 Python 绑定,可在 Qt支持的所有平台上运行,包括 Windows、macOS、Linux、iOS 和 Android。PyQt6 支持 Qt v6,PyQt5 支持 Qt v5,PyQt4 支持 Qt v4。这些绑定是作为一组 Python 模块实现的,包含 1,000 多个类。

14. pyGtk. 另一个 python GUI 库。它是创建著名的 Bittorrent 客户端的同一个库。
    PyGObject是一个 Python 包,它为基于GObject的库提供绑定,例如GTKGStreamer、 WebKitGTKGLibGIO等等。

15. Scapy . 用python制作的python包嗅探器和分析器。
    Scapy 是一个强大的交互式数据包操作程序。它能够伪造或解码多种协议的数据包,通过网络发送它们,捕获它们,匹配请求和回复等等。它可以轻松处理大多数经典任务,如扫描、跟踪路由、探测、单元测试、攻击或网络发现(它可以替代 hping、85% 的 nmap、arpspoof、arp-sk、arping、tcpdump、tshark、p0f 等)

16. pywin32 . 一个 python 库,它提供了一些有用的方法和类来与 windows 交互。
    这是 Python for Win32 (pywin32) 扩展的自述文件,它提供对许多来自 Python 的 Windows API 的访问。

17. nltk . Natural Language Toolkit – 我意识到大多数人不会使用这个工具包,但它足够通用。如果你想操作字符串,它是一个非常有用的库。但它的容量远不止于此。
    NLTK 是构建 Python 程序以处理人类语言数据的领先平台。它为超过 50 个语料库和词汇资源(如 WordNet)提供易于使用的接口,以及一套用于分类、标记化、词干提取、标记、解析和语义推理的文本处理库,工业强度 NLP 库的包装器,和一个活跃的讨论论坛

18. nose. python的测试框架。它被数以百万计的 Python 开发人员使用。如果您进行测试驱动开发,这是必须的。
    nose 扩展了单元测试,使测试更容易。

19. SymPy . SymPy 可以进行代数求值、微分、展开、复数等。它包含在纯 Python 发行版中。
    SymPy 是一个用于符号数学的开源 Python 库。它旨在成为一个功能齐全的计算机代数系统(CAS),同时保持代码尽可能简单,以便于理解和易于扩展。SymPy 完全用 Python 编写,不需要任何外部库。

20. IPython. 这个工具有多么有用,我怎么强调都不为过。这是一个关于类固醇的python提示。它具有完成、历史、shell 功能等等。IPython是一种基于Python的交互式解释器。相较于本地的Python Shell,IPython提供了更为强大的编辑和交互功能。


Supervisor 是一个客户端/服务器系统,允许其用户控制类 UNIX 操作系统上的许多进程
http://supervisord.org/index.html


PyForest、Emot、Geemap、Dabl 和 Sweetviz 是值得了解的库,因为它将复杂的任务变成了简单的任务.

当您开始为项目键入代码时,您的第一步是什么?您可能会导入您需要的库,对吗?问题是你永远不知道你需要多少库,直到你需要它并得到一个错误。这就是为什么 PyForest 是我所知道的最方便的库之一。PyForest 只需一行代码即可将 40 个最流行的库导入您的笔记本

Emot 是一个很好的库,它有可能大大改进您的下一个 NLP 项目。它将表情符号和表情符号转换为描述性信息
Geemap 是一个 Python 库,它允许与 Google Earth Engine 进行交互式地图绘制
Sweetviz 是一个低代码 Python 库,可生成漂亮的可视化效果,用两行代码启动您的探索性数据分析。输出是一个交互式 HTML 文件




inspect模块

提供了几个有用的函数来帮助获取有关活动对象的信息,例如模块、类、方法、函数、回溯、框架对象和代码对象。例如,它可以帮助您检查类的内容、检索方法的源代码、提取和格式化函数的参数列表,或者获取显示详细回溯所需的所有信息。
import inspect
print(inspect.getsource(inspect.getsource))
print(inspect.getmodule(inspect.getmodule))
print(inspect.currentframe().f_lineno)
该模块提供四种主要服务:类型检查、获取源代码、检查类和函数以及检查解释器堆栈。


Jedi 库是一个自动完成和代码分析库。它使编写代码更快、更高效

sh 

是 Python 2.6 - 3.8、PyPy 和 PyPy3 的成熟子进程替代品,它允许您像调用函数一样调用任何程序,windows上不可用

Python 是一种动态类型语言。定义变量、函数、类等时不需要指定数据类型
从 Python 3.5 开始,您可以选择在定义函数时提供类型提示
def greeting(name: str) -> str:
    return 'Hello ' + name
print(greeting('world'))
尽管不是强制性的,但类型注释可以使您的代码更易于理解。

uuid

A quick and easy way to generate Universally Unique IDs (or ‘UUIDs’) is through the Python Standard Library’s uuid module.

生成通用唯一 ID(或“UUID”)的一种快速简便的方法是通过 Python 标准库的 uuid 模块。
import uuid
user_id = uuid.uuid4()
print(user_id)

词汇表

https://docs.python.org/zh-cn/3.8/glossary.html#term-decorator

github和Ohloh
通过提供足够的信息来判断一个库是否有维护站仍然在工作

确定python安装路径
在cmd中输入where python

>>> import datetime
>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2021, 9, 11, 20, 10, 23, 212113)

>>> now.__str__()
'2021-09-11 20:10:23.212113'
>>> str(now)
'2021-09-11 20:10:23.212113'

>>> now.__repr__()
'datetime.datetime(2021, 9, 11, 20, 10, 23, 212113)'
>>> repr(now)
'datetime.datetime(2021, 9, 11, 20, 10, 23, 212113)'

>>> eval(repr(now))
datetime.datetime(2021, 9, 11, 20, 10, 23, 212113)

__str__ 和 __repr__ 函数都返回对象的字符串表示。__str__ 字符串表示应该是人性化的,主要用于记录目的,而 __repr__ 表示应该包含有关对象的信息,以便可以再次构造它。

您永远不应该直接使用这些函数,而应始终使用 str() 和 repr() 函数。

__repr__

在 Python 中定义类或对象时,提供一种将该对象表示为字符串的“官方”方式很有用
class someClass:
    def __repr__(self):
        return "<some description here>"
someInstance = someClass()
# prints <some description here>
print(someInstance)


>>> "repr() shows quotes: {!r}; str() doesn't: {!s}".format('test1', 'test2')

"repr() shows quotes: 'test1'; str() doesn't: test2"

class Person:
    def __init__(self, person_name, person_age):
        self.name = person_name
        self.age = person_age
    def __str__(self):
        return f'Person name is {self.name} and age is {self.age}'
    def __repr__(self):
        return f'Person(name={self.name}, age={self.age})'
p = Person('Pankaj', 34)
print(p.__str__())
print(p.__repr__())


输出:
Person name is Pankaj and age is 34
Person(name=Pankaj, age=34)

前面我们提到,如果我们不实现 __str__ 函数,则调用 __repr__ 函数。
只需注释 Person 类中的 __str__ 函数实现,print(p)就会打印{name:Pankaj, age:34}.

>>> '{:<30}'.format('left aligned')
'left aligned                  '
>>> '{:>30}'.format('right aligned')
'                 right aligned'
>>> '{:^30}'.format('centered')
'           centered           '
>>> '{:*^30}'.format('centered')  # use '*' as a fill char
'***********centered***********'

https://docs.python.org/zh-cn/3.8/library/string.html#format-specification-mini-language
>>> "{!s:<25}".format('Hello,World!')
'Hello,World!             '
>>> "{!r:^25}".format('Hello,World!')
"     'Hello,World!'      "
>>> "{!a:>25}".format('Hello,World!')
"           'Hello,World!'"
'!s' 会对值调用 str(),'!r' 调用 repr() 而 '!a' 则调用 ascii()
<左对齐,^居中对齐,>右对齐

# 将对齐应用于输出
name = '{:^20}'.format('journaldev')
print(name)

# 打印带有符号值的数字
print('{:+d}'.format(42))

# 格式化python 字典值
stark = {'first': 'Ned', 'second': 'Brandon', 'third': 'Rob'}
print('{first} {third}'.format(**stark))

# 可以将 Decimal 值格式化为精确点
value = '{:{width}.{prec}f}'.format(3.1428, width=5, prec=2)
print(value)

# 格式化日期时间值
from datetime import datetime
print('{:%Y-%m-%d %H:%M}'.format(datetime(2017, 12, 7, 13, 22)))

myDate = datetime(2017, 12, 7, 13, 22)
# now = datetime.now()
print('{:{dfmt} {tfmt}}'.format(myDate, dfmt='%Y-%m-%d', tfmt='%H:%M'))


在Python软件包索引(PyPI)https://pypi.org/ 上可以找到大多数流行的软件包。您还会在github,bitbucket和Google代码上找到很多Python软件包

easy_install 

一旦安装了setuptools,就可以使用easy_install您可以在Python安装的Scripts文件夹中找到安装的文件。确保将Scripts文件夹添加到系统路径,以便您可以在命令行上调用easy_install而不指定其完整路径
easy_install -h
easy_install package_name
easy_install -U SQLAlchemy
easy_install http://example.com/path/to/MyPackage-1.2.3.tgz
easy_install /path/to/downloaded/package

You may want to call pip -h to get a full listing of everything pip can do. One thing that pip can install that easy_install cannot is the Python wheel format. A wheel is a ZIP-format archive with a specially formatted filename and the .whl extension. You can also install wheels via its own command line utility. On the other hand, pip cannot install an egg. If you need to install an egg, you will want to use easy_install.
您可能想要调用 pip -h 来获取 pip 可以执行的所有操作的完整列表。 pip 可以安装而 easy_install 不能安装的一件事是 Python Wheel格式。 wheel是 ZIP 格式的档案,具有特殊格式的文件名和 .whl 扩展名。 您还可以通过其自己的命令行实用程序安装轮子。 另一方面,pip 不能安装egg。 如果您需要安装一个 egg,您将需要使用 easy_install。

pip(Pip Installs Packages)
查看版本
pip --version

查看帮助
pip --help
pip -h
安装wheel文件
pip install project_name # 在线安装discover, download and install 

pip install wheel_file.whl # 离线安装directly install the wheel

pip install some_package
安装指定版本
pip install some_package==1.1.2

安装一个最低版本
pip install "some_package>=1.1.2"

show 命令显示有关已安装软件包的信息,例如,它们的版本,作者,许可证,位置或要求
pip show some_package

list 命令按字母顺序列出了您在计算机上安装的所有软件包
pip list

outdated 命令获得过时软件包的列表以及可用的最新版本和最新版本
pip list -o
pip list --outdated

upgrade 命令更新软件包到最新的可用版本
pip install --upgrade some_package
pip install -U PackageName

uninstall 命令删除软件包
pip uninstall some_package

freeze 命令是用于以需求格式获取所有已安装软件包
以下命令是列出所有必要软件包名称并存入文件
pip freeze > requirements.txt

直接从特殊文件requirements.txt(需修改下)中安装软件包
pip install -r requirements.txt


Poetry
PYTHON打包和依赖管理变得容易


一个Python安装可能无法满足每个应用程序的要求,解决方案是创建一个 virtual environment
https://www.thepythoncorner.com/2016/11/using-virtual-environments-with-python/

https://docs.python.org/3/library/venv.html
当前,有两种用于创建Python虚拟环境的常用工具:

venv在Python 3.3和更高版本中默认可用,并在Python 3.4和更高版本中将pip和setuptools安装 到创建的虚拟环境中(虚拟环境中输入pip list)

virtualenv需要单独安装,但支持Python 2.7+和Python 3.3+,并且 pip, setuptools和 wheel默认情况下始终安装到创建的虚拟环境中(无论Python版本如何)。

要创建虚拟环境,您只需选择要使用virtualenv还是venv模块。
virtualenv适用于Python 2.7和Python 3.x,venv模块仅适用于Python 3.3或更高版本。

用于创建和管理虚拟环境的模块称为 venv

python -m venv my-project
source my-project/bin/activate
pip install all-the-modules 

win10 添加用户环境变量
在Windows上,venv按如下所示调用命令:
c:\>c:\Python35\python -m venv c:\path\to\myenv
另外,如果您为Python安装配置了PATH和PATHEXT变量,则:
c:\>python -m venv c:\path\to\myenv
在Windows上python已添加环境变量,运行:
C:\>python -m venv tutorial-env
如果它不存在,这将在命令所在路径创建 tutorial-env 目录,并在其中创建包含Python解释器,标准库和各种支持文件的副本的目录

# 当前目录创建虚拟环境
C:\Users\DZL>python -m venv 123
# 指定目录创建虚拟环境
C:\Users\DZL>python -m venv C:\456


在Windows上激活
C:\Users\DZL>C:\456\Scripts\activate.bat

退出
(456) C:\Users\DZL>deactivate
退出并关掉窗口
(456) C:\Users\DZL>exit

删除文件夹 del
删除文件 rmdir /s .
查看文件夹中的文件 dir

创建虚拟环境后,可以使用虚拟环境的二进制目录中的脚本“激活”它。该脚本的调用是特定于平台的(<venv>必须替换为包含虚拟环境的目录的路径):



Packages包
该目录需要包含名为“__init__.py”的文件。此文件可以为空,也可以包含有效的Python代码。此代码将在导入包时执行,因此可用于初始化包,例如,以确保导入某些其他模块或设置某些值

Python附带了许多预制的代码。这些代码段称为模块和包。一个模块是一个可导入的Python文件,而一个包则由两个或多个模块组成。可以像导入模块一样导入软件包

Python还提供了一种从模块导入所有函数和值的方法。这实际上是一个主意,因为它会污染您的命名空间命名空间是在程序生命周期中所有变量都存在的地方

pep8限制所有行最多79个字符

https://www.python.org/dev/peps/pep-0008/


检测代码规范有pep8 flake8和pylint
pep8  main.py

代码分析

代码概要分析是尝试在代码中查找瓶颈。分析应该查找代码中哪些部分花费的时间最长。一旦知道了这一点,便可以查看代码的这些部分,并尝试找到优化它的方法

使用cProfile分析代码确实非常容易。您需要做的就是导入模块并调用其运行功能


Python 3.7
>>> import types    
>>> print(len([i for i in dir(types) if not i.startswith('__')]))
27
Python有3种方法来找出运行什么操作系统os.name、sys.platform、platform.system()

 
  1. >>> import platform
  2. >>> platform.system() == 'Windows' and platform.release() == '7'
  3. True
  4. >>> 'Windows-7' in platform.platform()
  5. True


  1. import os
  2.  
  3. a = 'c:' # removed slash
  4. b = 'myFirstDirectory' # removed slash
  5. c = 'mySecondDirectory'
  6. d = 'myThirdDirectory'
  7. e = 'myExecutable.exe'
  8.  
  9. print(os.path.join(a + os.sep, b, c, d, e))
  10. print(os.sep)
  11. print(os.path.join(a+ os.sep, b, c, d, e).replace("\\","/"))
  12.  
  13. >>> %Run 11.py
  14. c:\myFirstDirectory\mySecondDirectory\myThirdDirectory\myExecutable.exe
  15. \
  16. c:/myFirstDirectory/mySecondDirectory/myThirdDirectory/myExecutable.exe
  17.  

密码生成

  1.  
  2. import string
  3. from secrets import choice
  4.  
  5. # 字母表加数字
  6. alphabet = string.ascii_letters + string.digits
  7. print(alphabet)
  8. while True:
  9.     # str.join(sequence) 方法用于将序列中的元素以指定的字符连接生成一个新的字符串
  10.     password = ''.join(choice(alphabet) for i in range(10))
  11.     print(password)
  12.     # 密码要求有小写字母、大写字母且数字大于等于3
  13.     if (any(c.islower() for c in password)
  14.         and any(c.isupper() for c in password)
  15.         and sum(c.isdigit() for c in password) >= 3):
  16.         break
  17.  
  18. print(password)
  19.  

魔术
开头和结尾的双下划线


Python注释

注释要与其下方的代码处于相同的缩进级别 
#用于Python中的单行注释,后跟一个空格
 """内容 """用于多行注释或块注释


文档字符串必须是对象(模块,函数,类和方法)定义中的第一条语句。否则为常规注释
Python解释器不会像注释一样忽略它们,可以使用特殊变量__doc__访问它们

def double(num):
    """Function to double the value"""
    return 2*num

print(double.__doc__)
>>>Function to double the value

Python缩进

许多高级编程语言,例如C,C ++,C#,都使用花括号{}标记代码块。Python通过缩进来实现。

代表函数或循环体的代码块以缩进开始,以第一条未缩进的行结束。

对于创建复合语句,缩进将是最必要的,在代码块中每行缩进四个空格(或相同数量)

Blocks 块
Indenting Code 缩进代码 

Python structures by colons and indentation
Python结构是通过冒号和缩进


异常

查找所有异常
print(dir(locals()['__builtins__']))
assert是条件错误处理的关键字,可以让你检查,以满足特定的标准。如果不满足条件,则会抛出 AssertionError。
def input_age(age):
   try:
       assert int(age) > 18
   except ValueError:
       return 'ValueError: Cannot convert into int'
   else:
       return 'Age is saved successfully'
 
print(input_age('23'))  # This will print
print(input_age(25))  # This will print
print(input_age('nothing'))  # This will raise ValueError which is handled
print(input_age('18'))  # This will raise AssertionError and the the program collapse
print(input_age(43))  # This will not print

使用raise关键字引发现有异常
def input_age(age):
   try:
       if(int(age)<=18):
           raise ZeroDivisionError
   except ValueError:
       return 'ValueError: Cannot convert into int'
   else:
       return 'Age is saved successfully'

print(input_age('23'))  # This will execute properly
print(input_age('18'))  # This will not execute properly


自定义异常类
class UnderAge(Exception):
   pass
 
def verify_age(age):
   if int(age) < 18:
       raise UnderAge
   else:
       print('Age: '+str(age))
 
# main program
verify_age(23)  # won't raise exception
verify_age(17)  # will raise exception

  1. # import module sys to get the type of exception
  2. import sys
  3.  
  4. randomList = ['a', 0, 2]
  5.  
  6. for entry in randomList:
  7.     try:
  8.         print("The entry is", entry)
  9.         r = 1/int(entry)
  10.         break
  11.     except:
  12.         print("Oops!", sys.exc_info()[0], "occurred.")
  13.         print("Next entry.")
  14.         print()
  15. print("The reciprocal of", entry, "is", r)
  16.  
  17.  
  18. # import module sys to get the type of exception
  19. import sys
  20.  
  21. randomList = ['a', 0, 2]
  22.  
  23. for entry in randomList:
  24.     try:
  25.         print("The entry is", entry)
  26.         r = 1/int(entry)
  27.         break
  28.     except Exception as e:
  29.         print("Oops!", e.__class__, "occurred.")
  30.         print("Next entry.")
  31.         print()
  32. print("The reciprocal of", entry, "is", r)

  1. # define Python user-defined exceptions
  2. class Error(Exception):
  3.     """Base class for other exceptions"""
  4.     pass
  5.  
  6.  
  7. class ValueTooSmallError(Error):
  8.     """Raised when the input value is too small"""
  9.     pass
  10.  
  11.  
  12. class ValueTooLargeError(Error):
  13.     """Raised when the input value is too large"""
  14.     pass
  15.  
  16.  
  17. # you need to guess this number
  18. number = 10
  19.  
  20. # user guesses a number until he/she gets it right
  21. while True:
  22.     try:
  23.         i_num = int(input("Enter a number: "))
  24.         if i_num < number:
  25.             raise ValueTooSmallError
  26.         elif i_num > number:
  27.             raise ValueTooLargeError
  28.         break
  29.     except ValueTooSmallError:
  30.         print("This value is too small, try again!")
  31.         print()
  32.     except ValueTooLargeError:
  33.         print("This value is too large, try again!")
  34.         print()
  35.  
  36. print("Congratulations! You guessed it correctly.")

异常有层次结构,子类在父类前面


  1. # Handle exceptions with a try/except block
  2. try:
  3.     # Use "raise" to raise an error
  4.     raise IndexError("This is an index error")
  5. except IndexError as e:
  6.     pass                 # Pass is just a no-op. Usually you would do recovery here.
  7. except (TypeError, NameError):
  8.     pass                 # Multiple exceptions can be handled together, if required.
  9. else:                    # Optional clause to the try/except block. Must follow all except blocks
  10.     print("All good!")   # Runs only if the code in try raises no exceptions
  11. finally:                 #  Execute under all circumstances
  12.  
  13.     print("We can clean up resources here")
  14.  
  15.  
  16. #
  17. my_dict = {"a":1, "b":2, "c":3}
  18. try:
  19.     value = my_dict["a"]
  20. except KeyError:
  21.     print("A KeyError occurred!")
  22. else:
  23.     print("No error occurred!")
  24. finally:
  25.     print("The finally statement ran!")

Python中的多行语句


通常每个Python语句都以换行符结尾。但是,我们可以使用行连续字符(\)将其扩展到多行。

Python提供了两种在程序中启用多行语句的方法
显式行继续---立即使用换行符(\)将语句拆分为多行


隐式行连续---隐式行连续是当您使用括号(),方括号[]和花括号{}中的任何一个拆分语句时 。您需要使用上述结构将目标语句括起来。
还可以使用分号将多个语句放在一行中,如:a = 1; b = 2; c = 3

Python模块属性:name,doc,file,dict
__name__属性返回模块的名称
默认情况下,脚本文件名(不包括扩展名.py)是__name__属性的值
>>> __name__
'__main__'

__doc__属性将返回在模块代码开头定义的字符串。
名称,文档,文件,字典

__file__ 是一个可选属性,其中包含从中加载模块文件的名称和路径
>>> import io
>>> io.__file__
'C:\\Python38\\lib\\io.py'


__dict__属性将返回包含模块属性,函数和其他定义及其各自值的字典对象
>>> import math
>>> math.__dict__
{'__name__': 'math', '__doc__': 'This module provides access to the mathematical ...}
dir()是一个内置函数,它也返回模块中所有属性和函数的列表


Modules模块
'import'关键字用于将特定模块导入您的python代码

每个模块只能在每个解释器会话或程序或脚本中导入一次
from importlib import reload
    reload(one_time)


如果你import一个模块,解释器会在以下位置按照给定的顺序搜索这个模块:
  1. 首先,Python解释器尝试在当前工作目录中定位模块。
  2. 如果未找到,则搜索PYTHONPATH环境变量中的目录。
  3. 如果仍然找不到,它将搜索安装默认目录。例如C:\Python38
Python内置模块用C编写,并与Python解释器集成
显示所有可用模块的列表
>>> help('modules')


可以获得这些模块的完整列表
import sys 
print(sys.builtin_module_names)
所有其他以下划线开头的名称是与模块关联的默认Python属性

sys模块
提供用于操纵Python运行时环境不同部分的函数和变量。

sys.argv:返回传递给Python脚本的命令行参数列表。此列表中索引0处的项目始终是脚本的名称。其余参数存储在后续索引处。
sys.exit():这将导致脚本退回到Python控制台或命令提示符。通常用于在发生异常的情况下安全地退出程序。
sys.maxsize:返回变量可以采用的最大整数。
sys.path:这是一个环境变量,是所有Python模块的搜索路径。
sys.version:此属性显示一个字符串,其中包含当前Python解释器的版本号。




打印python 格言
import this
详解
https://inventwithpython.com/blog/2018/08/17/the-zen-of-python-explained/

import __hello__将显示Hello World....
import antigravity浏览器会打开一个漫画!

python关键字

Python 3.8中有35个关键字 。 3.9有36个关键字,只有三个是大写开头的
>>> import keyword
>>> len(keyword.kwlist)
35
>>> keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

>>> help("keywords")

Here is a list of the Python keywords.  Enter any keyword to get more help.

False               class               from                or
None                continue            global              pass
True                def                 if                  raise
and                 del                 import              return
as                  elif                in                  try
assert              else                is                  while
async               except              lambda              with
await               finally             nonlocal            yield
break               for                 not                 



Python是区分大小写的语言,始终命名有意义的标识符,可以使用下划线分隔多个单词this_is_a_long_variable


 iterators, generators and decorators
迭代器,生成器和装饰器


装饰器接受一个函数,添加一些功能并返回它

  1. def star(func):
  2.     def inner(*args, **kwargs):
  3.         print("*" * 30)
  4.         func(*args, **kwargs)
  5.         print("*" * 30)
  6.     return inner
  7.  
  8.  
  9. def percent(func):
  10.     def inner(*args, **kwargs):
  11.         print("%" * 30)
  12.         func(*args, **kwargs)
  13.         print("%" * 30)
  14.     return inner
  15.  
  16.  
  17. @star
  18. @percent
  19. def printer(msg):
  20.     print(msg)
  21.  
  22. '''
  23. 相当于
  24. def printer(msg):
  25.    print(msg)
  26. printer = star(percent(printer))
  27. '''
  28.  
  29. printer("Hello")
  30.  

 Generators 生成器

生成器功能非常有用。可以通过与常规函数相同的方式声明自定义生成器,只是有一个区别:return关键字被替换为yield。

生成器函数依次一次只生成一个值,仅在明确要求它们为新值时才生成,而不是一次全部给出。调用生成器不会立即执行它。相反,将返回一个可以迭代的生成器对象

yield实际上是保存了函数的状态

在每个时间点上,只有一个值才会产生并存储在内存中:上一个值在我们移至下一个值之后会被忘记,因此不会占用空间。但是请记住,正是由于在需要生成新值时忘记了先前的值,所以我们只能对这些值进行一次检查。

def generator():
    for i in range(6):
        yield i*i

g = generator()
    for i in g:
        print(i)


定义生成器的另一种方法是生成器表达式,其类似于列表推导。语法上的唯一区别是方括号:列表推导语句应使用方括号[],定义生成器时应使用圆括号()

values = (-x for x in [1,2,3,4,5])
for x in values:
    print(x, end='') 
>>> -1-2-3-4-5

>>> values = (-x for x in [1,2,3,4,5])
>>> next(values)
-1
>>> next(values)
-2
>>> next(values)
-3
>>> 

  • 生成器允许声明一个行为类似于迭代器的函数。
  • 生成器之所以懒惰,是因为它们仅在我们要求时才给我们带来新的值。
  • 有两种创建生成器的方法:生成器函数和生成器表达式。
  • 生成器具有存储效率,因为它们只需要为其生成的一个值存储即可。
  • 生成器只能使用一次。
def my_generator():
    i = 0
    while True:
        yield i
        i = i+1
 
gen_1 = my_generator()
print(next(gen_1))
print(next(gen_1))
 
gen_2 = my_generator()
print(next(gen_2))
 
print(next(gen_1))


最新的输出值由解释器自动存储在名为“_”的特殊变量中,下划线变量仅在Python shell中可用。它在Python脚本或程序中不可用

>>> 1+2
3
>>> _
3
>>> 

只做循环未使用的变量前面加_ 如:_i    要用关键字的变量后面加_ 如:str_

退出shell

exit() quit()
shell中没有括号的退出在Python2.x中起作用,但在Python3.x中不再起作用
Ctrl + Z 再EnterEnter



您很可能已经在某处读到了Python语言是一种解释型程序设计或脚本语言。事实是:Python既是解释语言又是编译语言。但是将Python称为编译语言会产生误导。人们会认为编译器将Python代码转换为机器语言。Python代码被转换为中间代码,该代码必须由称为PVM(Python虚拟机)的虚拟机执行。这与Java采用的方法类似。甚至还有一种将Python程序转换为Java虚拟机(JVM)的Java字节码的方法。这可以通过Jython实现。
Python解释将源代码转换为字节码,然后把编译好的字节码转发到Python虚拟机(PVM)中进行执行


问题是,是否必须编译我的Python脚本以使其更快,或者如何编译它们?答案很简单:通常,您不需要做任何事情,也不必打扰,因为“ Python”已经在为您做事,即自动采取必要的步骤。

无论出于何种原因,您都想手动编译python程序?没问题。可以使用py_compile模块,或者使用解释器shell来完成
import py_compile
py_compile.compile('my_first_simple_program.py')

或在shell提示下使用以下命令
python -m py_compile my_first_simple_program.py

无论哪种方式,您都可能注意到两件事:首先,将存在一个新的子目录“ __pycache__”(如果尚不存在)。您将在此子目录中找到文件“my_first_simple_script.cpython-34.pyc”。这是字节格式的文件的编译版本。

还可以使用compileall模块自动编译当前工作目录下所有Python文件
python -m compileall

但是正如我们所说,您不必也不应该为编译Python代码而烦恼。有充分的理由对用户隐藏了该编译。一些新手有时会怀疑这些带有.pyc后缀的不祥文件可能来自哪里。如果Python对Python程序所在的目录具有写访问权,则它将编译后的字节码存储在以.pyc后缀结尾的文件中。如果Python没有写访问权限,则该程序仍然可以运行。程序退出时,字节码将被产生但被丢弃。每当调用Python程序时,Python都会检查是否存在带有.pyc后缀的编译版本。该文件必须比带有.py后缀的文件新。如果存在这样的文件,Python将加载字节码,这将加快脚本的启动时间。如果没有字节码版本,Python将在开始执行程序之前创建字节码。执行Python程序意味着在Python上执行字节代码。

Compiler编译器
定义:编译器是一种计算机程序,它将一种编程语言(源语言)的源代码转换(翻译)成另一种计算机语言(目标语言)。 在大多数情况下,编译器用于将源代码转换为可执行程序,即,它们将代码从高级编程语言转换为低级(或低级)语言,主要是汇编代码或机器代码。

Interpreter解释器
定义:解释器是一种计算机程序,可执行以编程语言编写的指令。 它可以直接执行源代码,也可以在第一步中将源代码转换为更有效的表示形式并执行该代码。



函数作用域的LEGB顺序
L : local 函数内部作用域
E  :   enclosing 函数内部与内嵌函数之间
G :  global 全局作用域
B: build-in 内置作用

python在函数里面的查找分为4种,称之为LEGB,也正是按照这是顺序来查找的

Variables变量

注意:在Python中,我们实际上并未为变量分配值。相反,Python将对象(值)的引用提供给变量

全局变量global
Python中关键字global的基本规则是:
当我们在函数内部创建变量时,默认情况下它是局部的。
当我们在函数外部定义变量时,默认情况下它是全局的。您不必使用global关键字。
我们使用global关键字在函数内部读写全局变量。
global在函数外使用关键字无效


x = "global"
def foo():
    global x
    y = "local"
    x = x * 2
    print(x)
    print(y)
foo()
print(x)

globalglobal
local
globalglobal

def foo():
    x = 20
    def bar():
        global x
        x = 25
    print("Before calling bar: ", x)
    print("Calling bar now")
    bar()
    print("After calling bar: ", x)
foo()
print("x in main : ", x)

>>>Before calling bar: 20
>>>Calling bar now
>>>After calling bar: 20
>>>x in main : 25

在函数体内创建了全局变量,则对f函数体内部所做的任何操作都是对f之外的全局变量s进行的

def f():
    global s
    print(s)
    s = "dog"
    print(s) 
s = "cat" 
f()
print(s)



在Python中变量您不需要声明。只需输入变量,当赋值给它时,它会自动知道给定的值是int,char,甚至是String

不仅变量的值可能在程序执行期间发生变化,而且类型也是如此
i=10 赋值中相等的“=”符号不应视为“等于”。它应该被“读取”或解释为“被设置为”



id()函数

用来确认内存地址
在以下两种情况下,Python还将分配相同的内存地址
字符串没有空格,并且少于20个字符
如果整数介于-5到+255之间
这个概念被称为Interning。Python这样做是为了节省内存


id(10)
每个实例(对象或变量)都具有标识,即在脚本或程序中唯一的整数
x is y 相当于id(x)==id(y)


dir()内置函数

查看 Python 对象内部并查看它具有哪些属性
是Python3中强大的内置函数,它返回任何对象的属性和方法的列表(例如函数,模块,字符串,列表,字典等)
dir()尝试返回被调用对象的有效属性列表。同样,dir()函数在处理不同类型的对象时的行为也大不相同,因为它旨在生成最相关的对象,而不是完整的信息。

  • 对于类对象,它还返回所有有效属性和基本属性的名称列表。
  • 对于模块/库对象,它将尝试返回该模块中包含的所有属性的名称列表。
  • 如果未传递任何参数,它将返回当前作用域中的名称列表。

[x for x in dir(moudel) if not x.startswith('__')]

通过导入builtins模块,可以获得内置函数,异常和其他对象的列表
import builtins
print(dir(builtins))



type()函数
my_list =[10,20,20.5,'Python',100] 
print(type(my_list)) # class 'list' 
print(type(my_list).__name__) # list


help()函数
用于显示模块,函数,类,关键字等的文档
>>> help()
您现在有一个“help>”提示,而不是“ >>>”。在帮助模式下,您可以浏览Python中找到的各种模块,关键字和主题。还要注意,当键入单词“ modules”时,由于Python搜索其库文件夹以获取列表,您会看到延迟。
未导入模块,需添加引号
>>>help("os.walk")
导入模块
>>>import os
>>>help(os.walk)

zip()函数
用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表
zip() 内置函数接受许多可迭代对象并返回一个元组列表。每个元组按位置索引对输入对象的元素进行分组。
在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。如需展示列表,需手动 list() 转换
您还可以通过对它们调用 *zip() 来“解压缩”对象。
keys = ['a', 'b', 'c']
vals = [1, 2, 3]
zipped = dict(zip(keys, vals))
print(zipped)


join()函数
用于将序列中的元素以指定的任意字符串联生成一个新的字符串
>>>"*".join("love")
l*o*v*e


len()函数
返回对象的长度(元素个数)。实参可以是序列(如 string、bytes、tuple、list 或 range 等)或集合(如 dictionary、set 或 frozen set 等)


>>> print(10)
10
>>> print(0x10)
16
>>> print(0o10)
8
>>> print(0b10)
2

函数hex,bin,oct可用于将整数转换为整数的对应字符串表示形式

>>> hex(97)
'0x61'
>>> oct(97)
'0o141'
>>> bin(97)
'0b1100001'
>>> int(0X61)
97
>>> int(0o141)
97

x = "Hallo"
t = str(x)
u = t.encode("UTF-8")
print(u)
# Output: b'Hallo'



在Python中,正则表达式表示为RE(RE,regex或regex模式)通过re模块导入
资料
https://www.programiz.com/python-programming/regex
工具
https://regex101.com/

https://pymotw.com/3/re/index.html
  • 正则表达式方法包括 re.match(),re.search()和re.findall()

Python数据类型

在Python中,我们不需要在显式提及数据类型的情况下声明变量,Python在运行时直接根据语法确定文字的类型。例如,引号标记着字符串值的声明,方括号代表列表,而大括号则代表字典。同样,非小数将被分配为Integer类型,而带小数点的将为浮点数。

Booleans布尔值

几乎每种编程语言都具有的数据类型,Python也是如此。Python中的布尔值可以有两个值– True(1)或False(0)

condition = False
if condition == True:
    print("You can continue with the prpgram.")
else:
    print("The program will end here.")



>>> A, B = True + 0, False + 0
>>> print(A, B)
1 0
>>> type(A), type(B)
(<class 'int'>, <class 'int'>)

Python 三元运算符语法
[when_true] if [condition] else [when_false]

Numbers数值


在Python 2.x中,除(/)将返回整数商作为输出
在Python 3.x中,除(/)将返回浮点商作为输出
运算符(//)返回整数商,而mod(%)运算符给出余数。但是,您可以通过使用divmod()函数来获得这两者


>>> divmod(7, 2) # -->(3, 1) 
>>> 7 / 2    # -->3.5 
>>> 7 // 2    # -->3
>>> -7 // 2  # -->-4
>>> -7.0 // 2    # -->-4.0 
>>> 7 % 2 # -->1 
>>> eval('2+3')  # -->5

Python 2.x具有四种内置数据类型(int,long,float和complex)来表示数字。后来,Python 3.x删除了long类型,并将int类型扩展为无限长度

整数,浮点数和复数属于Python数字类别。在Python类它们被定义为int,float和complex
使用内置函数type() 来确定变量或值属于哪个类
内置函数isinstance()用于检查对象是否属于特定类 



>>> isinstance(2.2, float)
True


num = 2
print("The number (", num, ") is of type", type(num))

num = 3.0
print("The number (", num, ") is of type", type(num))

num = 3+5j
print("The number ", num, " is of type", type(num))
print("The number ", num, " is complex number?", isinstance(3+5j, complex))

#Output
The number ( 2 ) is of type <class 'int'>
The number ( 3.0 ) is of type <class 'float'>
The number (3+5j) is of type <class 'complex'>
The number (3+5j) is complex number? True



在Python中,我们可以在数字后添加“ j”或“ J”以使其复数

x = 3 + 4j
print(type(x))
# <class 'complex'>
print(x.real)
# 3.0
print(x.imag)
# 4.0

Bytes字节

是Python中的不可变类型。它可以存储从0到255的字节序列(每个8位)。类似于数组,我们可以使用索引来获取单个字节的值。但是我们不能修改该值


>>> # Make an empty bytes object (8-bit bytes)
>>> empty_object = bytes(16)
>>> print(type(empty_object))
<class 'bytes'>
>>> print(empty_object)
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'


------------------------------------------------------------------------------------------ Strings字符串

数据类型之间的转换


隐式转换:Python总是将较小的数据类型转换为较大的数据类型,以避免数据丢失

显式类型转换也称为类型转换,对象的数据类型由用户使用预定义的函数int()float()str(),等进行转换,可能会发生数据丢失

>>> int('100', base=2)
4
>>> int('100', base=3)
9
>>> int('100', base=4)
16
>>> int('100', base=6)
36
>>> int('100', base=7)
49
>>> int('123', base=7)  # 1*7*7 +2*7+3
66

  1.  
  2. strings = "This is Python"
  3. char = "C"
  4. multiline_str = """This is a multiline string with more than one line code."""
  5. unicode = u"\u00dcnic\u00f6de"
  6. raw_str = r"raw \n string"
  7.  
  8. >>> float(5)
  9. 5.0
  10.  
  11. # 从float到int的转换将截断该值(使其接近零)
  12. >>> int(10.6)
  13. 10
  14. >>> int(-10.6)
  15. -10
  16.  
  17. # 字符串之间的转换必须包含兼容的值
  18. >>> float('2.5')
  19. 2.5
  20. >>> float(3)
  21. 3.0
  22. >>> complex(4 + 7j)
  23. (4+7j)
  24. >>> str(25)
  25. '25'
  26. >>> int('1p')
  27. ValueError: invalid literal for int() with base 10: '1p'
  28.  
  29. # 我们甚至可以将一个序列转换为另一序列
  30. >>> set([1,2,3])
  31. {1, 2, 3}
  32. >>> tuple({5,6,7})
  33. (5, 6, 7)
  34. >>> list('hello')
  35. ['h', 'e', 'l', 'l', 'o']
  36.  
  37. # 要转换为字典,每个元素必须成对
  38. >>> dict([[1,2],[3,4]])
  39. {1: 2, 3: 4}
  40. >>> dict([(3,26),(4,44)])
  41. {3: 26, 4: 44}


Python有4种类型的内置数据结构,即List,Dictionary,Tuple和Set。

type({})    <class 'dict'>
type({1})   <class 'set'>
type((1))   <class 'int'>
type((1,))  <class 'tuple'>

0和空的List,Dictionary,Tuple和Set的布尔值为False
bool()
None为假且not None为真。

collections --- 容器数据类型
这个模块实现了特定目标的容器,以提供Python标准内建容器 dict , list , set , 和 tuple 的替代选择。.

  1. fruits = ["apple", "mango", "orange"] # list
  2. numbers = (1, 2, 3) # tuple
  3. alphabets = {'a':'apple', 'b':'ball', 'c':'cat'} # dictionary
  4. vowels = {'a', 'e', 'i' , 'o', 'u'} # set
  5.  


List列表
列表是可变数据结构,即可以在列表创建之后将项添加到列表中。单个列表可以包含字符串,整数以及对象。列表还可用于实现堆栈和队列。列表是可变的,即一旦声明它们就可以被改变,
列表是项目的有序序列。它是Python中最常用的数据类型之一,非常灵活。列表中的所有项目不必是同一类型。
Python列表是一个类似构造的数组,它以有序序列存储任意类型的对象。它非常灵活,没有固定大小。列表中的索引在Python中从零开始


[True, False, 1, 1.1, (1+2j), 'Learn', b'Python']
>>> for item in assorted_list:
 print(type(item))

<class 'bool'>
<class 'bool'>
<class 'int'>
<class 'float'>
<class 'complex'>
<class 'str'>
<class 'bytes'>



Dictionary字典
Python中的字典是键-值对的无序集合。这是Python中的内置映射类型,其中键映射到值。这些键值对提供了一种直观的数据存储方式
3.6的dict是有序的,在此版本之前皆是无序(写答案当前最新版为3.6)
为什么需要字典?
该词典解决了有效存储大量数据集的问题。Python已对字典对象进行了高度优化以检索数据。

用于创建字典的Python语法使用大括号{},其中每个项目都是一对形式的key:value。键和值可以是任何Python数据类型

Python provides power data types like lists and associative arrays, called dict in Python
Python提供了功能数据类型如列表和关联数组,在Python中称为字典

可以使用方法items(),keys()和values()从字典创建列表。顾名思义,方法keys()创建一个列表,该列表仅包含字典的键。values()生成一个由值组成的列表。items()可用于创建由2元组(键,值)组成的列表

列表和字典之间的区别是什么?
列表是有序的对象序列,而字典是无序集。但主要区别在于词典中的项目是通过键而不是通过其位置访问的
字典不支持序列数据类型(如字符串,元组和列表)的序列操作。字典属于内置映射类型,但到目前为止它们是这种类型的唯一代表! 
key必须为不可变类型

不能通过数字访问字典的元素

我们可以在字典中使用任意类型作为值,但是对键有限制。只有不可变数据类型可以用作键,即不能使用列表或字典,可以使用元组

创建空字典
>>> my_dict  =  {} 
>>> another_dict  =  dict ()

my_dict = {'key': 'value'} # PEP8注意:后面有个空格
children = {'Emily''artist''Adam''astronaut''Nancy''programmer'}

dict(americano=8.0),表达式的左侧被视为变量,因此它不能是整数,带引号的字符串,列表,多字表达式等。是的,以下几行将给您一个错误:

d1 = dict(888=8.0)
d2 = dict("americano"=8.0)
d3 = dict(["americano", "filter"]=8.0)
d4 = dict(the best americano=8.0)


将列表转换为词典
dict(list(zip(A,B)))


>>> sample_dict = {'key':'value', 'jan':31, 'feb':28, 'mar':31}
>>> type(sample_dict)
<class 'dict'>
>>> sample_dict
{'mar': 31, 'key': 'value', 'jan': 31, 'feb': 28}


>>> sample_dict.keys()
dict_keys(['mar', 'key', 'jan', 'feb'])
>>> sample_dict.values()
dict_values([31, 'value', 31, 28])
>>> sample_dict.items()
dict_items([('mar', 31), ('key', 'value'), ('jan', 31), ('feb', 28)])

只能检查是否存在词典“中”
"one" in filled_dict  # => True

filled_dict.update({'one':4})

>>> {'a': 1, **{'b': 2}}
{'a': 1, 'b': 2}
>>> {'a': 1, **{'a': 2}}
{'a': 2}

>>> "name" in my_dict         # this is good
>>> "name" in my_dict.keys()  # this works too, but is slower
尽管这对您现在可能并不重要,但在实际工作情况下,几秒钟很重要。当您要处理数千个文件时,从长远来看,这些小技巧可以为您节省大量时间!


我们甚至可以将一个序列转换为另一序列。

>>> set([1,2,3])
{1, 2, 3}
>>> tuple({5,6,7})
(5, 6, 7)
>>> list('hello')
['h', 'e', 'l', 'l', 'o']

要转换为字典,每个元素必须成对:

>>> dict([[1,2],[3,4]])
{1: 2, 3: 4}
>>> dict([(3,26),(4,44)])
{3: 26, 4: 44}




Tuple元组
元组是与列表相同的项目的有序序列,唯一的区别是元组是不可变的。元组一旦创建就无法修改。元组用于写保护数据,通常比列表快,因为它不能动态更改。它在括号()中定义,其中各项之间用逗号分隔。元组是一系列不可变的Python对象。元组就像列表一样,但一旦声明元组就无法更改,但可以使用关键字“del”完全删除元组。元组通常比列表更快
将元组用于异构(不同的)数据类型,将列表用于同质(相似)的数据类型

my_tuple = ("hello")
print(type(my_tuple))  # <class 'str'>

# Creating a tuple having one element
my_tuple = ("hello",)  
print(type(my_tuple))  # <class 'tuple'> 

# Parentheses is optional
my_tuple = "hello",
print(type(my_tuple))  # <class 'tuple'> 


说元组是可变的在技术上是错误的,因为其值是可变的
>>> a = ('dogs', 'cats', [1, 2, 3])
>>> b = ('dogs', 'cats', [1, 2, 3])
>>> a == b
True
>>> a is b
False

>>> a[2].append(99)
>>> a
('dogs', 'cats', [1, 2, 3, 99])
>>> a == b
False

要写一个空元组,你需要写成两个不包含任何内容的括号
tup1 = ()

要为单个值编写元组,您需要包含逗号,即使只有一个值
tup2 = (1,)


元组打包和拆包


x = ("Guru99", 20, "Education")
# tuple packing
(company, emp, profile) = x
# tuple unpacking
print(company)
print(emp)
print(profile)


元组比较
a=(5,6)
b=(5,4)
if (a>b):
    print("a is bigger")
else:
    print ("b is bigger")
       

比较从每个元组的第一个元素开始。在这种情况下,5> 5是不确定的。所以它进入下一个元素。6> 4,所以输出a更大


元组切片
从元组中获取特定的子元素集
x = ("a","b","c","d","e")
print(x[1:3])

带有元组的内置功能
为了执行不同的任务,元组允许你使用许多内置函数,如all(),any(),enumerate(),max(),min(),sorted(),len(),tuple()等。

x = [True, True, False]
if any(x):
    print("At least one True")
if all(x):
    print("Not one False")
if any(x) and not all(x):
    print("At least one True and one False")



元组和字典

Dictionary可以通过调用items返回元组列表,其中每个元组都是一个键值对

a = {'x':100, 'y':200}
for i in a.items():
    print(i)
#输出
#('x', 100)
#('y', 200)


b = list(a.items())
print(b) 
#输出 
#[('x', 100), ('y', 200)]


元组优于列表的优点
迭代通过元组比使用列表更快,因为元组是不可变的。
由不可变元素组成的元组可以用作字典的键,这对于列表是不可能的
如果您拥有不可变的数据,那么将其实现为元组将保证它保持写保护

sequence[start:stop:step]
start: 0
stop: len(sequence)
step: 1


Set集合
是唯一项的无序集合,用大括号{}内的逗号分隔的值定义。集合中的项目不排序。

我们可以在两个集合上执行集合操作,例如联合,相交。设置具有唯一值。他们消除重复
由于set是无序集合,因此索引没有意义。因此,切片运算符[]不起作用

Python集合具有以下特征

元素没有特定的顺序,并且它们的位置可能不一致
每个项目在集合中都是唯一的,因此不能重复。
元素是不可变的,因此一旦添加就不能接受更改。
集合本身是可变的,并允许添加或删除项目。


使用集合,我们可以执行一些数学运算,例如并集,相交,对称差和补数。

我们想要创建一个集合,我们可以使用序列或另一个可迭代对象调用内置的set函数:
集合有多个用例。例如,它们用于在列表中去重

在所有Python数据类型中,集合是一种支持数学运算(例如,并集,交集,对称差等)的集合。
集合是唯一且不可变的对象的无序集合。它的定义始于用大括号{}括起来的括号,其项之间用逗号分隔。
由于集合是从数学中的“集合”派生而来的,因此它不能多次出现同一元素

与列表相比,集合类型具有明显的优势。它实现了高度优化的方法,该方法检查容器是否承载特定元素。此处使用的机制基于称为哈希表的数据结构

要创建集合,请使用序列或任何可迭代对象调用内置的set()函数,另一种更简单的方法是指定用大括号{}括起来的元素

  1.  
  2. fruits = ["apple", "mango", "orange"] # list
  3. numbers = (1, 2, 3) # tuple
  4. alphabets = {'a':'apple', 'b':'ball', 'c':'cat'} # dictionary
  5. vowels = {'a', 'e', 'i' , 'o', 'u'} # set
  6.  
  7. print(fruits)  # =>['apple', 'mango', 'orange']
  8. print(numbers)  # =>(1, 2, 3)
  9. print(alphabets)  # =>{'a': 'apple', 'b': 'ball', 'c': 'cat'}
  10. print(vowels)  # =>{'e', 'a', 'o', 'i', 'u'}
  11.  
  12.  
  13. sample_set = set("Python data types")
  14. type(sample_set)  # =><class 'set'>
  15. sample_set  # =>{'e', 'y', 't', 'o', ' ', 'd', 's', 'P', 'p', 'n', 'h', 'a'}
  16.  
  17. another_set = {'red', 'green', 'black'}
  18. type(another_set)  # =><class 'set'>
  19. another_set  # =>{'red', 'green', 'black'}
  20.  
  21.  
  22. # Set与字典的键类似,集合的元素必须是不变的
  23. invalid_set = {[1], 1} # => Raises a TypeError: unhashable type: 'list'
  24. valid_set = {(1,), 1}
  25.  
  26. {1, 2, 3, 4, 5} & {3, 4, 5, 6} # => {3, 4, 5}
  27. {1, 2, 3, 4, 5} | {3, 4, 5, 6} # => {1, 2, 3, 4, 5, 6}
  28. {1, 2, 3, 4} - {2, 3, 5}  # => {1, 4}
  29. {1, 2, 3, 4} ^ {2, 3, 5}  # => {1, 4, 5}
  30. {1, 2} >= {1, 2, 3} # => False
  31. {1, 2} <= {1, 2, 3} # => True
  32.  
  33. # 可以构造集合和字典推导
  34. {x for x in 'abcddeef' if x not in 'abc'}  # => {'d', 'e', 'f'}
  35. {x: x**2 for x in range(5)}  # => {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
  36.  
  37.  
  38. A = {'Peter', 'Raymond', 'Egon'}
  39. B = {'Winston', 'Peter', 'Raymond'}
  40. C = {'Janine','Raymond', 'Egon'}
  41.  
  42. # 求并集
  43. # 生成新集合
  44. # print(A | B)
  45. # print(A.union(C))
  46. # 更新集合
  47. # A |= B
  48. # A.update(B)
  49. # print(A)
  50.  
  51. # 求交集
  52. # print(A & B)
  53.  
  54. # A.intersection(B)
  55. # A &= B
  56. # A.intersection_update(B)
  57. # print(A)
  58.  
  59. # 求差集
  60. # print(A - B)
  61. # A.difference(B)
  62. # print(A.difference(B))
  63. #
  64. # A -= B
  65. A.difference_update(B)
  66. print(A)
  67.  
  68. '''
  69. 每个操作都有两个版本:一个返回一个新集合,另一个更新现有的集合,
  70. 调用每种操作有两种方式:按方法和按运算符。
  71. 注意语法不是使用set运算方法和运算符的唯一区别。更重要的是,set运算符要求将两个参数都设置为set,而该方法仅要求第一个参数为set,而第二个参数可以是任何可迭代的对象,例如列表或字符串。在这种情况下,该方法将隐式地从第二个参数中创建一个集合
  72. '''
  73.  
  74. set.method(*list_of_sets)
  75. # sets are within a container
  76. languages = [{'c', 'c++', 'python'}, {'python', 'javascript'}, {'python', 'java'}]
  77. the_best = set.intersection(*languages)
  78. print(the_best)
  79. # The output is {'python'}
  80.  





Class

要创建一个类,我们需要使用Python的class关键字,后跟该类的名称。在Python中,惯例表示类名应首字母大写。类有一个称为__init__的特殊方法(用于初始化)。每当您基于此类创建(或实例化)对象时,都会调用此方法。__init__方法仅被调用一次,而不会在程序中再次被调用。__init__的另一个术语构造函数,尽管该术语在Python中使用不多。

您可能想知道为什么我总是说方法而不是函数当函数在类中时,其名称会更改为“ method”。您还将注意到,每个方法都必须至少具有一个参数(即self),而对于常规函数而言,情况并非如此。
多重继承可以将类的方法解析顺序(MRO)视为__mro__属性或mro()方法。前者返回一个元组,而后者返回一个列表
# Python 3.x syntax
class Vehicle:
    """docstring"""

    def __init__(self):
        """Constructor"""
        pass

Looping循环
循环顾名思义,它一次又一次地重复着事,直到满足某个条件

Python仅限于两个循环“While循环”和“for循环”
Python中的for循环用于迭代序列(listtuplestring)或其他可迭代对象。在序列上进行迭代称为遍历。
我们可以在for循环中使用range()函数来迭代数字序列。它可以与len()函数结合使用索引来遍历序列

# Program to iterate through a list using indexing
genre = ['pop', 'rock', 'jazz']
# iterate over the list using index
for i in range(len(genre)):

print("I like", genre[i])



while循环是根据条件语句是true还是false执行的
For循环称为迭代器,它根据条件集迭代元素
Python For循环也可以用于一组各种其他东西(指定我们想要循环的元素集合)

break在For循环中用于在任何特定点断开或终止程序
如果break语句在嵌套循环(另一个循环内的循环)内,则break将终止最里面的循环

continue语句将继续打印语句,并根据条件设置打印出结果
Continue语句仅在当前迭代时用于跳过循环内的其余代码。循环不会终止,但会继续进行下一个迭代




for循环也可以具有可选的else块。 如果用于循环的序列中的项目用尽,则执行else部分。
break关键字可用于停止for循环。 在这种情况下,其他部分将被忽略。
因此,如果没有中断发生,则for循环的else部分将运行。

# program to display student's marks from record
student_name = 'Soyuj'

marks = {'James': 90, 'Jules': 55, 'Arthur': 77}

for student in marks:
    if student == student_name:
        print(marks[student])
        break
else:
    print('No entry with that name found.')

for循环中的枚举函数返回我们正在查看的索引号的集合成员

while循环
#Example file for working with loops
#
def main():
    x=0
    #define a while loop
    while(x <4):
        print(x)
        x = x+1

if __name__ == "__main__":
    main()

for循环


#Example file for working with loops
def main():
    x=0
    #Define a for loop 
    for x in range(2,7):
        print(x)
if __name__ == "__main__":
    main()

def main():
 #use a for loop over a collection
 Months = ["Jan","Feb","Mar","April","May","June"]
 for m in Months:
     print(m)
  
if __name__ == "__main__":
 main()

def main():
# use the break and continue statements
    for x in range (10,20):
        if (x == 15): break
 #if (x % 2 == 0) : continue
        print(x)

if __name__ == "__main__":
 main()
枚举


def main():     
    Months = ["Jan","Feb","Mar","April","May","June"]
    for i, m in enumerate (Months):
        print(i,m)
        
if __name__== "__main__":
  main()    



Iteration 迭代
迭代可以通过'for'和'while'循环在python中执行。除了迭代特定条件之外,我们还可以迭代字符串,列表和元组


示例1:通过while循环对条件进行迭代
i = 1
while (i < 10): 
i += 1
print(i)
示例2:通过for循环对字符串进行迭代
s = "Hello World"
for i in s : 
print(i)

示例3:通过列表上的for循环进行迭代
L = [1, 4, 5, 7, 8, 9] 
for i in L: 
print(i)
示例4:针对范围的for循环的迭代
for i in range(0, 10): 
print(i)

选择
Python中的选择使用两个关键字'if'和'elif'以及else(elseif)
Python中的条件语句由if语句处理

#
#Example file for working with conditional statement
#
def main():
 x,y =8,8
 
 if(x < y):
  st= "x is less than y"
 
 elif (x == y):
  st= "x is same as y"
 
 else:
  st="x is greater than y"
 print(st)
 
if __name__ == "__main__":
 main()

用最少的代码执行条件语句

A If B else C

def main():
 x,y = 10,8
 st = "x is less than y" if (x < y) else "x is greater than or equal to y"
 print(st)
 
if __name__ == "__main__":
 main()

嵌套if语句

total = 100
#country = "US"
country = "AU"
if country == "US":
    if total <= 50:
        print("Shipping Cost is  $50")
    elif total <= 100:
        print("Shipping Cost is $25")
    elif total <= 150:
     print("Shipping Costs $5")
    else:
        print("FREE")
if country == "AU": 
    if total <= 50:
        print("Shipping Cost is  $100")
    else:
 print("FREE")


switch语句是一个多路分支语句,用于将变量的值与case语句中指定的值进行比较。Python语言没有switch语句。Python使用字典映射在Python中实现switch语句
def SwitchExample(argument):
    switcher = {
        0: " This is Case Zero ",
        1: " This is Case One ",
        2: " This is Case Two ",
    }
    return switcher.get(argument, "nothing")


if __name__ == "__main__":
    argument = 1
    print (SwitchExample(argument))

Python运算符

算术运算符(+,-,*,/,//,%,**)
执行各种算术运算

比较运算符(>,<,==,!=,>=,<=)
使我们能够确定两个值是否相等或一个值是否大于另一个值,然后根据结果进行决策

赋值运算符(=) 
复合运算(+=,-=,*=,/=,%=,**=,&=,|=,^=,>>=,<<=)

逻辑运算符(and,or,not)
此类操作的结果为true或false(即布尔值)

按位运算符($,|,~,^,>>,<<)
处理整数值的各个位,他们将它们视为二进制位序列

高级Python运算符,例如身份运算符或成员资格运算符

定义以自己的特定方式使用 Python 的标准运算符符号的对象
class Thing:
    def __init__(self, value):
        self.__value = value
    def __gt__(self, other):
        return self.__value > other.__value
    def __lt__(self, other):
        return self.__value < other.__value
something = Thing(100)
nothing = Thing(0)
# True
print(something > nothing)
# False
print(something < nothing)
# Error
print(something + nothing)

身份运算符

这些运算符使我们能够比较两个Python对象/变量的内存位置。它们可以让我们找到对象是否共享相同的内存地址。保持相等值的变量不一定相同。
另外,我们可以使用这些运算符来确定一个值是特定的类还是类型。
Python中使用的两个身份运算符是(is,is not)

  1. # Using 'is' identity operator  Output: True
  2. a = 7
  3. if (type(a) is int):
  4.     print("true")
  5. else:
  6.     print("false")
  7.  
  8. # Using 'is not' identity operator  Output: True
  9. b = 7.5
  10. if (type(b) is not int):
  11.     print("true")
  12. else:
  13.     print("false")
  14.    
  15.  
  16. x1 = 5
  17. y1 = 5
  18. x2 = 'Hello!'
  19. y2 = 'Hello!'
  20. x3 = [1,2,3]
  21. y3 = [1,2,3]
  22.  
  23. # Output: False
  24. print(x1 is not y1)
  25.  
  26. # Output: True
  27. print(x2 is y2)
  28.  
  29. # Output: False
  30. print(x3 is y3)
  31.  
  32. '''
  33. 在shell中不相等
  34. >>> x2 = 'Hello!'
  35. >>> y2 = 'Hello!'
  36. >>> x2 is y2
  37. False
  38. '''


成员资格运算符

成员资格运算符使我们能够测试值是否为其他Python对象(例如字符串,列表或元组)的成员。在C语言中,成员资格测试要求遍历序列并检查每个值。但是与C相比,Python使建立成员资格变得非常容易。另外,请注意,此运算符还可以针对字典进行测试,但只能针对键而不是值进行测试。

它们用于测试在序列(字符串,列表,元组,集合和字典)中是否找到值或变量。
在字典中,我们只能测试键的存在,而不是值 

Python中使用了两个成员运算符(in,not in)

空字符串被视为任何字符串的子字符串

  1. # Using Membership operator
  2. str = 'Python operators'
  3. dict = {6:'June',12:'Dec'}
  4.  
  5. print('P' in str)
  6. print('Python' in str)
  7. print('python' not in str)
  8. print(6 in dict)
  9. print('Dec' in dict)
  10.  
  11.  
  12. x = 'Hello world'
  13. y = {1:'a',2:'b'}
  14.  
  15. # Output: True
  16. print('H' in x)
  17.  
  18. # Output: True
  19. print('hello' not in x)
  20.  
  21. # Output: True
  22. print(1 in y)
  23.  
  24. # Output: False
  25. print('a' in y)
  26.  


函数
函数是一个代码块,以Python关键字def开头,后跟函数的实际名称。函数可以接受零个或多个参数,关键字参数或两者的混合。函数总是返回一些东西。如果您未指定函数应返回的内容,则它将返回None
在类中就是方法
def function_name(parameters):
"""docstring"""
statement(s)

#如果您在与当前脚本相同的文件夹中有一个名为math.py的Python脚本,则将加载文件math.py 而不是内置的Python模块。之所以会这样,是因为本地文件夹的优先级高于Python的内置库。
import math
#dir()可以找出在模块中定义了哪些功能和属性
dir(math)


Python中的函数是一段可重用的代码,用于执行单个相关操作。
def语句定义的函数
每个函数中的代码块以冒号(:)开头,并且应缩进(四个空格)
任何参数或输入参数都应放在这些括号内
在声明函数之后,应该在代码之前留下至少一个缩进
在def函数中的整个代码中应该保持相同的缩进样式
可选的文档字符串(docstring),用于描述函数的功能可以使用“return”命令将值返回给函数调用
该语句可以包含被求值并返回值的表达式。如果语句中没有表达式,或者return语句本身不存在于函数内,则该函数将返回None对象

当参数未提供给调用函数时,Python将打印一个随机值,如(0x021B2D30)


函数视为一堆代码,用于在整个Python脚本中执行特定任务。Python使用关键字'def'来定义函数。不需要在python中显式指定函数的返回类型。可以通过函数名称跟在括号中参数列表来调用该函数

函数体中的第一个语句通常是一个"""字符串""",访问字符串可以使用function_name .__ doc__访问
该语句称为Docstring

无返回函数return,调用print将返回特殊值None

您还可以使用特殊语法将函数设置为接受任意数量的参数或关键字参数。 要获取无限参数,请使用* args;对于无限关键字参数,请使用** kwargs。 “ args”和“ kwargs”两个词并不重要。 那只是约定。 您可以将它们称为* bill和** ted,它的工作方式相同。 此处的关键是星号的数量

>>> def many(*args, **kwargs):
        print(args)
        print(kwargs)

>>> many(1, 2, 3, name="Mike", job="programmer")
(1, 2, 3)
{'job': 'programmer', 'name': 'Mike'}
首先,我们使用新语法创建函数,然后使用三个常规参数和两个关键字参数进行调用。 函数本身将打印出两种类型的参数。 如您所见,args参数变成一个元组,kwargs变成一个字典
有时,我们并不预先知道将传递给函数的参数数量。Python允许我们通过带有任意数量参数的函数调用来处理这种情况。
def varargs(*args):
    return args
varargs(1, 2, 3)  # => (1, 2, 3)

def keyword_args(**kwargs):
    return kwargs
keyword_args(big="foot", loch="ness")  # => {'big': 'foot', 'loch': 'ness'}

def all_the_args(*args, **kwargs):
    print(args)
    print(kwargs)
"""
all_the_args(1, 2, a=3, b=4) prints:
    (1, 2)
    {'a': 3, 'b': 4}

"""
在函数定义中,我们在参数名称前使用星号(*)表示此类参数
def greet(*names):
   """This function greets all
   the person in the names tuple."""

   # names is a tuple with arguments
   for name in names:
       print("Hello",name)


greet("Monica","Luke","Steve","John")
字典对象前面的双星号允许您将该字典的内容作为命名参数传递给函数
字典的键是参数名称,值是传递给函数的值

dictionary = {"a": 1, "b": 2}
def someFunction(a, b):
    print(a + b)
    return
# these do the same thing:
someFunction(**dictionary)
someFunction(a=1, b=2)


input()函数
返回作为用户输入给出的字符串,没有尾随换行符。
input()语句被执行时,程序会暂停,直到用户提供输入并按下回车键。
input([prompt])--prompt提示是我们希望在屏幕上显示的字符串,它是可选的

>>> num = input('Enter a number: ')
Enter a number: 10
>>> num

'10'

print()函数
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
objects是要打印的值
sep 默认为空格字符
end默认为新行(\n),不换行的话是end=''
The file默认值为sys.stdout(屏幕)

print(1, 2, 3, 4)     #1 2 3 4
print(1, 2, 3, 4, sep='*')    #1 * 2 * 3 * 4
print(1, 2, 3, 4, sep='#', end='&')    #1#2#3#4&
print(125 + 125) # "250"
print("125" + "125") # "125125"
print(125 * 4) # "500"
print("125" * 4) # "125125125125"
print("This is a number:", 125) # "This is a number: 125"

该示例还显示,如果在括号中用逗号分隔它们,则可以打印不同类型的值,并用空格分隔
+ 连接字符串之间没有空格
接字符串之间有空格
在Python 2中,“print”语句不是函数,因此可以在没有括号的情况下调用。但是,在Python 3中,它是一个函数,必须用括号调用

#关键字参数“sep”分配任意字符串
print(192,168,178,42,sep=".")

#关键字参数“end”分配任意字符串,一行输出
for i in range(10):
    print(i,end="")

# 输出存在data.txt中,不打印出来
with open("data.txt","w") as fh:
    print("422 is the answer, but what is the question?", file=fh)

import sys
with open('output.txt','w') as f:
    sys.stdout = f
    print("first: Hello Python!")
    print("first: We are printing to file.")

print("second: Hello Python!", file=open('output.txt','a'))
print("second: We are printing to file.", file=open('output.txt','a'))

import sys
print("Normal: 0", file=sys.stdout)
# output 字体为红颜色
print("Error: 1", file=sys.stderr)

Python 默认print函数尝试打印出任何大的嵌套对象,结果相当难看。
这是标准库的漂亮打印模块pprint介入的地方。它以易于阅读的格式打印出复杂的结构化对象。

import requests
import pprint
url = 'https://randomuser.me/api/?results=1'
users = requests.get(url).json()
pprint.pprint(users)

lambda函数

也称为匿名函数,不需要名称(即标识符)
在Python中,匿名函数是没有名称定义的函数。虽然通常的功能是使用def关键字定义的,但在Python中,匿名函数是使用lambda关键字定义的。因此,匿名函数也称为lambda函数

lambda arguments: expression
lambda本身返回一个函数对象

lambda函数可以采取任何数目的由逗号分隔的参数,但它必须由一个的单个表达式。计算该表达式并返回结果。请注意,您在这里不需要return语句

调用lambda函数
Python语法允许我们通过将函数括在括号中并立即传递参数来做到这一点
(lambda x, y: (x + y) % 2)(1, 5)
# The output is 0

lambda可以有任意数量的参数(parameter),可以是由逗号分隔的参数列表组成;在其函数体中只能有1个表达式,表达式expression是使用这些参数的算术表达式,默认情况下返回该表达式,lambda函数不包含return语句

python中lambda和常规函数之间的区别
Lambda函数只能在其体内有一个表达式。
常规函数可以在其正文中包含多个表达式和语句。

Lambda没有与之关联的名称。这就是为什么它们也被称为匿名函数。
常规函数必须具有名称和签名。

Lambda不包含return语句,因为主体是自动返回的。
需要返回值的函数应包含return语句


  1. adder = lambda x, y: x + y
  2. print (adder (1, 2))
  3.  
  4. #What a lambda returns
  5. string='some kind of a useless lambda'
  6. print(lambda string : print(string))
  7.  
  8. #What a lambda returns #2
  9. x="some kind of a useless lambda"
  10. (lambda x : print(x))(x)
  11.  
  12. #A REGULAR FUNCTION
  13. def guru( funct, *args ):
  14. funct( *args )
  15. def printer_one( arg ):
  16. return print (arg)
  17. def printer_two( arg ):
  18. print(arg)
  19.  
  20. #CALL A REGULAR FUNCTION
  21. guru( printer_one, 'printer 1 REGULAR CALL' )
  22. guru( printer_two, 'printer 2 REGULAR CALL \n' )
  23. #CALL A REGULAR FUNCTION THRU A LAMBDA
  24. guru(lambda: printer_one('printer 1 LAMBDA CALL'))
  25. guru(lambda: printer_two('printer 2 LAMBDA CALL'))



不要在生产环境中编写复杂的lambda函数,因为代码维护起来很难
如果你发现自己制作复杂的单行表达式,那么定义一个合适的函数将是一个非常优越的实践


  1. import tkinter as tk
  2.  
  3. class App:
  4.     """"""
  5.  
  6.     def __init__(self, parent):
  7.         """Constructor"""
  8.         frame = tk.Frame(parent)
  9.         frame.pack()
  10.  
  11.         btn22 = tk.Button(frame, text="22", command=lambda: self.printNum(22))
  12.         btn22.pack(side=tk.LEFT)
  13.         btn44 = tk.Button(frame, text="44", command=lambda: self.printNum(44))
  14.         btn44.pack(side=tk.LEFT)
  15.  
  16.         quitBtn = tk.Button(frame, text="QUIT", fg="red", command=frame.quit)
  17.         quitBtn.pack(side=tk.LEFT)
  18.  
  19.  
  20.     def printNum(self, num):
  21.         """"""
  22.         print("You pressed the %s button" % num)
  23.  
  24. if __name__ == "__main__":
  25.     root = tk.Tk()
  26.     app = App(root)
  27.     root.mainloop()


range()函数

我们可以使用range()函数生成数字序列。range(10)会产生0到9之间的数字(10个数字)。
我们还可以将开始,停止和步长定义为range(start,stop,step size)。如果未提供,则步长默认为1。
此函数未将所有值存储在内存中,因此效率低下。因此它会记住开始,停止,步长并在旅途中生成下一个数字。
要强制此函数输出所有项目,可以使用函数list()

# Output: range(0, 10)
print(range(10))

# Output: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(list(range(10)))

# Output: [2, 3, 4, 5, 6, 7]
print(list(range(2, 8)))

# Output: [2, 5, 8, 11, 14, 17]
print(list(range(2, 20, 3)))


main()函数

if __name__ == "__main__"

编写私有化部分 ,这句代码以上的部分,可以被其它的调用,以下的部分只有这个文件自己可以看见,如果文件被调用了,其他人是无法看见私有化部分的
print("Hello") print("__name__ value: ", __name__) def main(): print("python main function") if __name__ == '__main__': main()
# Hello
# __name__ value:  __main__
# python main function

  1. # file one.py
  2. def func():
  3.     print("func() in one.py")
  4. print("top-level in one.py")
  5. if __name__ == "__main__":
  6.     print("one.py is being run directly")
  7. else:
  8.     print("one.py is being imported into another module")
  9.    
  10. # file two.py
  11. import one
  12. print("top-level in two.py")
  13. func()
  14. if __name__ == "__main__":
  15.     print("two.py is being run directly")
  16. else:
  17.     print("two.py is being imported into another module")





  1. # Python program to illustrate
  2. # math module
  3. import math
  4.  
  5. def Main():
  6.     num = float(input("Enter a number: "))
  7.     # fabs is used to get the absolute value of a decimal
  8.     num = math.fabs(num)
  9.     print(num)
  10.  
  11.  
  12. if __name__=="__main__":
  13.     Main()


Python中的递增和递减运算符
# A Sample Python program to show loop (unlike many
# other languages, it doesn't use ++)
for i in range(0, 5):
    print(i)


break,continue,pass, else
break - 将你带出当前的循环。
continue - 结束循环中的当前迭代并移至下一次迭代。
pass - pass语句什么都不做。它可以在需要声明时使用。语法上但该程序不需要任何操作。它通常用于创建最小类。
else - while循环为False,或者for循环遍历完后才运行


如何读取文件的内容。该技能非常有用,因为有时使用Python读取文件比直接打开文件更容易或更方便。同样,这些是可用的方法:

以下是 Python 中允许您读取和写入文件的一些函数:

read() :该函数读取整个文件并返回一个字符串
readline() :此函数从该文件中读取行并作为字符串返回。一次读取文件一行,如果第 n 次被调用,它将获取第 n 行。
readlines() :此函数返回一个列表,其中每个元素都是该文件的一行。读取文件为行列表
但是,最好的方法是使用for循环遍历文件的各行

write() :此函数将固定的字符序列写入文件。
writelines() :此函数写入字符串列表。
append() :此函数将字符串附加到文件而不是覆盖文件。


filter函数用于从元素序列中选择一些特定元素。它接受一个返回True或False的函数并将其应用于序列,返回仅包含函数返回True的序列成员的列表
filter(function or None, iterable) --> filter object
filter(function, sequence) 需要2个参数:一个定义过滤约束的函数;一个序列(任何迭代器,如列表,元组等)

Filter: filter (lambda parameter: expression, iterable-sequence)

sequences = [10,2,8,7,5,4,3,11,0, 1]
filtered_result = filter (lambda x: x > 4, sequences) 
print(list(filtered_result))

map函数用于将特定操作应用于序列中的每个元素并返回一个迭代器如果有多个参数,map()将返回一个包含元组的列表这些元组包含来自所有迭代的相应项
map(func, *iterables) --> map object 
r = map(func,seq)
1、定义要对元素执行的操作的函数func
2、一个或多个序列seq


Map: map (lambda parameter: expression, iterable-sequences)

sequences = [10,2,8,7,5,4,3,11,0, 1]
filtered_result = map (lambda x: x*x, sequences) 
print(list(filtered_result))
x = [1, 2, 3]
y = map(lambda x : x + 1 , x)
# prints out [2,3,4]
print(list(y))

reduce函数对序列的前2个元素执行定义的操作,保存此结果,使用保存的结果和序列中的下一个元素执行操作,重复直到不再剩下任何元素
reduce(function, sequence[, initial]) -> value

#这是一个返回列表中所有元素的乘积的程序
reduce (lambda parameter1, parameter2: expression, iterable-sequence)

  1.  
  2.  import functools
  3. #由于该reduce方法已从Python3的内置函数中删除,因此请不要忘记functools在代码中导入
  4.  
  5. #定义一个名为sequence的列表
  6. sequences = [1,2,3,4,5]
  7.  
  8. #我们声明一个名为product的变量,它将存储减少的值
  9. #在列表的每个元素上运行的lambda函数。它将按照之前的结果返回该数字的乘积。
  10. product = functools.reduce(lambda x, y: x*y, sequences)
  11. print(product)
  12.  
  13. my_strings = ['a', 'b', 'c', 'd', 'e']
  14. my_numbers = [1,2,3,4,5]
  15.  
  16. results = list(zip(my_strings, my_numbers))
  17. print(results)
  18. >>> [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]
  19.  
  20. results = list(map(lambda x, y: (x, y), my_strings, my_numbers))
  21. print(results)
  22. >>> [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]
  23.  
  24.  
  25. scores = [66, 90, 68, 59, 76, 60, 88, 74, 81, 65]
  26. def is_A_student(score):
  27.     return score > 75
  28.  
  29. over_75 = list(filter(is_A_student, scores))
  30. print(over_75)
  31. >>> [90, 76, 88, 81]
  32.  
  33. over_75 = list(filter(lambda x: int(x) > 75, scores))
  34. print(over_75)
  35. >>> [90, 76, 88, 81]
  36.  
  37.  
  38. dromes = ("demigod", "rewire", "madam", "freer", "anutforajaroftuna", "kiosk")
  39.  
  40. palindromes = list(filter(lambda word: word == word[::-1], dromes))
  41. print(palindromes)
  42. >>> ['madam', 'anutforajaroftuna']
  43.  
  44.  
  45. from functools import reduce
  46.  
  47. numbers = [3, 4, 6, 9, 34, 12]
  48. def custom_sum(first, second):
  49.     return first + second
  50.  
  51. result = reduce(custom_sum, numbers)
  52. print(result)
  53. >>> 68
  54.  
  55.  
  56. result = reduce(lambda x, y: x+y, numbers)
  57. print(result)
  58. >>> 68
  59. circle_areas = [3.56773, 5.57668, 4.00914, 56.24241, 9.01344, 32.00013]
  60.  
  61. result = list(map(round, circle_areas, range(1,5)))
  62. print(result)
  63. >>> [3.6, 5.58, 4.009, 56.2424]
  64.  
  65. from functools import reduce
  66.  
  67. my_floats = [4.35, 6.09, 3.25, 9.77, 2.16, 8.88, 4.59]
  68. my_names = ["olumide", "akinremi", "josiah", "temidayo", "omoseun"]
  69. my_numbers = [4, 6, 9, 23, 5]
  70.  
  71.  
  72. map_result = list(map(lambda x: x, my_floats))
  73. print(map_result)
  74. >>> [4.35, 6.09, 3.25, 9.77, 2.16, 8.88, 4.59]
  75.  
  76. filter_result = list(filter(lambda name: len(name) < 8, my_names))
  77. print(filter_result)
  78. >>> ['olumide', 'josiah', 'omoseun']
  79.  
  80. reduce_result = reduce(lambda num1, num2: num1 * num2, my_numbers)
  81. print(reduce_result)
  82. >>> 24840
  83.  


List Comprehension列表推导
[表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件]
是一种在Python中定义和创建列表的优雅方式
[(x,y,z) for x in range(1,30) for y in range(x,30) for z in range(y,30) if x**2 + y**2 == z**2]
numbers = [1,2,3,4,5,6,7]
evens = [x for x in numbers if x % 2 is 0]
odds = [y for y in numbers if y not in evens]
cities = ['London', 'Dublin', 'Oslo']
def visit(city):
    print("Welcome to "+city)
for city in cities:
    visit(city)

# Declare a list 
x = [2, 3, 4, 5, 6] 

# Perform the same operation as in above post 

print(list(map(lambda i:i*5,filter(lambda j:j%2,x))))

解包
解包是Python的另一个很棒的特性。可以分别使用*和**将列表或字典解压缩为函数参数


  1. def point(x, y):
  2.     print(x,y)
  3.  
  4. foo_list = (3, 4)
  5.  
  6. bar_dict = {'y': 3, 'x': 2}
  7.  
  8. point(*foo_list) # Unpacking Lists 解包列表
  9.  
  10. point(**bar_dict) # Unpacking Dictionaries  解包字典

枚举
想在for循环中找到索引吗?使用enumerate换行迭代,它将生成项目及其索引

  1. # Know the index faster
  2.  
  3. vowels=['a','e','i','o','u']
  4.  
  5. for i, letter in enumerate(vowels):
  6.     print (i, letter)
  7.  


链式比较运算符
可以在Python中链式比较运算符answer = 1 <x <10在Python中是可执行的


Python文件处理:创建,打开,追加,读取,写入

如果您需要获取默认字符编码,请导入locale模块并调用locale.getpreferredencoding()在我的 Windows 笔记本电脑上,它返回'cp1252',但在我楼上的 Linux 机器上,它返回'UTF8'

  1. # Writing to a file
  2. contents = {"aa": 12, "bb": 21}
  3. with open("myfile1.txt", "w+") as file:
  4.     file.write(str(contents))        # writes a string to a file
  5.  
  6.  
  7.  
  8. import json
  9.  
  10. with open("myfile2.txt", "w+") as file:
  11.     file.write(json.dumps(contents)) # writes an object to a file
  12.  
  13.  
  14.  
  15. # Reading from a file
  16. with open('myfile1.txt', "r+") as file:
  17.     contents = file.read()           # reads a string from a file
  18. print(contents)
  19. # print: {'aa': 12, 'bb': 21}
  20.  
  21.  
  22.  
  23. with open('myfile2.txt', "r+") as file:
  24.     contents = json.load(file)       # reads a json object from a file
  25. print(contents)    
  26. # print: {'aa': 12, 'bb': 21}



Python允许您读取,写入和删除文件
使用open(“filename”,“w +”)函数创建文件。如果文件不存在,+告诉python编译器创建一个文件
要将数据附加到现有文件,请使用命令open(“Filename”,“ a ”)
使用read函数读取文件的整个内容
使用readlines函数逐个读取文件的内容。


  1. def main():
  2.     f= open("guru99.txt","w+")
  3.     #f=open("guru99.txt","a+")
  4.     for i in range(10):
  5.          f.write("This is line %d\r\n" % (i+1))
  6.     f.close()
  7.     #Open the file back and read the contents
  8.     #f=open("guru99.txt", "r")
  9.     #if f.mode == 'r':
  10.     #   contents =f.read()
  11.     #    print (contents)
  12.     #or, readlines reads the individual line into a list
  13.     #fl =f.readlines()
  14.     #for x in fl:
  15.     #print(x)
  16. if __name__== "__main__":
  17.   main()

Python复制文件方法

person1 = ["Swen", ["Seestrasse", "Konstanz"]]

#深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。
from copy import deepcopy
person2 = deepcopy(person1)
person2[0] = "Sarah"
person2[1][0] = "Bücklestrasse"

print(person1, person2)
# ['Swen', ['Seestrasse', 'Konstanz']] ['Sarah', ['Bücklestrasse', 'Konstanz']]


浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。
person3 = person1.copy()
person3[0] = "Sarah"
person3[1][0] = "Bücklestrasse"

print(person1, person3)
# ['Swen', ['Bücklestrasse', 'Konstanz']] ['Sarah', ['Bücklestrasse', 'Konstanz']]


以下命令用于复制文件 
shutil.copy(SRC,DST)

以下命令用于使用元数据信息复制文件
shutil.copystat(SRC,DST)


  1. import os
  2. import shutil
  3. from os import path
  4.  
  5. def main():
  6.     # make a duplicate of an existing file
  7.     if path.exists("1.xlsx"):
  8.         # get the path to the file in the current directory
  9.         src = path.realpath("1.xlsx")
  10.      #seperate the path from the filter
  11.         head, tail = path.split(src)
  12.         print("path:" +head)
  13.         print("file:" +tail)
  14.      #let's make a backup copy by appending "bak" to the name
  15.         dst = src+".bak"
  16.      # nowuse the shell to make a copy of the file
  17. #        shutil.copy(src, dst)
  18.         #copy over the permissions,modification
  19.         shutil.copystat(src,dst)
  20.  
  21. if __name__=="__main__":
  22.  main()

您可以获取有关上次修改的文本文件的信息

  1. import os
  2. from os import path
  3. import datetime
  4. from datetime import date, time, timedelta
  5. import time
  6.  
  7. def main():
  8.  
  9.     # Get the modification time
  10.     t = time.ctime(path.getmtime("1.xlsx.bak"))
  11.     print(t)
  12.     print(datetime.datetime.fromtimestamp(path.getmtime("1.xlsx.bak")))
  13.  
  14.  
  15. if __name__ == "__main__":
  16.     main()


  1. import shutil
  2. import os
  3.  
  4. source = "/home/career_karma/data"
  5. destination = "/home/career_karma/old_data"
  6.  
  7. files = os.listdir(source)
  8.  
  9. for file in files:
  10.     new_path = shutil.move(f"{source}/{file}", destination)
  11.     print(new_path)
  12.  
  13. # -----------------------------
  14. import os
  15. import shutil
  16.  
  17. path = r'C:\1111'
  18.  
  19. print("Before moving file:")
  20. print(os.listdir(path))
  21.  
  22. # Source path
  23. source = r'C:\1111\444'
  24. # Destination path
  25. destination = r'C:\1111\1'
  26.  
  27. dest = shutil.move(source, destination)
  28. # 如果源是目录, copytree()则会调用
  29. # dest = shutil.move(source, destination, copy_function = shutil.copytree)
  30.  
  31. print("After moving file:")
  32. print(os.listdir(path))
  33. print("Destination path:", dest)
  34.  
  35. # 拷贝源文件夹中所有文件或文件夹到源文件夹中
  36. from distutils.dir_util import copy_tree
  37.  
  38. # copy subdirectory example
  39. fromDirectory = r"C:/111"
  40. toDirectory = r"C:/222"
  41.  
  42. copy_tree(fromDirectory, toDirectory)
  43.  


Python创建zip / tar存档

要压缩整个目录,请使用命令shutil.make_archive("name","zip", root_dir)

要选择要压缩的文件,请使用命令ZipFile.write(filename)


  1. import os
  2. import shutil
  3. from zipfile import ZipFile
  4. from os import path
  5. from shutil import make_archive
  6.  
  7.     # Check if file exists
  8.        if path.exists("123.txt"):
  9.     # get the path to the file in the current directory
  10.         src = path.realpath("123.txt");
  11.     # rename the original file
  12.         os.rename("career.123.txt","123.txt")
  13.     # now put things into a ZIP archive
  14.         root_dir,tail = path.split(src)
  15.         shutil.make_archive("123 archive","zip",root_dir)
  16.     # more fine-grained control over ZIP files
  17.         with ZipFile("test123.zip", "w") as newzip:
  18.             newzip.write("123.txt")
  19.             newzip.write("123.txt.bak")

要压缩整个目录,请使用命令shutil.make_archive("name","zip", root_dir)

要选择要压缩的文件,请使用命令ZipFile.write(filename)


pickle 

Python中序列化过程的名称。通过pickle,我们可以将对象层次结构转换为可存储的二进制格式(通常人类可读)。要pickle一个对象,只需导入pickle模块并调用dumps()函数,该函数将被pickle的对象作为参数传递。并非每个对象都是可picklable的。无法对某些对象(例如数据库连接,打开的文件的句柄等)进行pickle


  1. dump(object, file)
  2. dumps(object) -> string
  3. load(file) -> object
  4. loads(string) -> object
  5.  
  6.  
  7. >>> import pickle
  8. >>> f = open('somedata', 'wb')
  9. >>> pickle.dump([1, 2, 3, 4], f)
  10. >>> pickle.dump('hello', f)
  11. >>> pickle.dump({'Apple', 'Pear', 'Banana'}, f)
  12. >>> f.close()
  13. >>> f = open('somedata', 'rb')
  14. >>> pickle.load(f)
  15. [1, 2, 3, 4]
  16. >>> pickle.load(f)
  17. 'hello'
  18. >>> pickle.load(f)
  19. {'Apple', 'Pear', 'Banana'}
  20.  
  21. --------------------------------------------------------------
  22.  
  23. import pickle
  24.  
  25. data = {'da': 111, 2: [23,1,4], '23': {1:2,'d':'sad'}}
  26.  
  27. # pickle a variable to a file
  28. f = open('somefile.bin', 'wb')
  29. pickle.dump(data, f)
  30. f.close()
  31.  
  32. # reload a file to a variable
  33. with open('somefile.bin', 'rb') as f:
  34.     data = pickle.load(f)
  35. print(data)
  36.  
  37.  
  38. ------------------------
  39. import pickle
  40.  
  41. class Animal:
  42.     def __init__(self, number_of_paws, color):
  43.         self.number_of_paws = number_of_paws
  44.         self.color = color
  45.  
  46. class Sheep(Animal):
  47.     def __init__(self, color):
  48.         Animal.__init__(self, 4, color)
  49.  
  50. # Step 1: Let's create the sheep Mary
  51. mary = Sheep("white")
  52.  
  53. print(str.format("My sheep mary is {0} and has {1} paws", mary.color, mary.number_of_paws))
  54.  
  55. # Step 2: Let's pickle Mary
  56. my_pickled_mary = pickle.dumps(mary)
  57.  
  58. print ("Would you like to see her pickled? Here she is!")
  59. print (my_pickled_mary)
  60.  
  61. # Step 3: Now, let's unpickle our sheep Mary creating another instance, another sheep... Dolly!
  62. dolly = pickle.loads(my_pickled_mary)
  63.  
  64. # Dolly and Mary are two different objects, in fact if we specify another color for dolly
  65. # there are no conseguencies for Mary
  66. dolly.color = "black"
  67.  
  68. print (str.format("Dolly is {0} ", dolly.color))
  69. print (f'Mary is {mary.color}')
  70.  
  71.  
  72. ---------------------------------------------------------
  73.  
  74. # 异步生成器
  75. import asyncio
  76.  
  77. async def ticker(delay, to):
  78.     """Yield numbers from 0 to *to* every *delay* seconds."""
  79.     for i in range(to):
  80.         yield i
  81.         await asyncio.sleep(delay)
  82.  
  83. async def main():
  84.     mylist = []
  85.     async for x in ticker(1,10):
  86.         print(x)
  87.         mylist.append(x)
  88.        
  89. #    mylist = [x async for x in ticker(1,10)]
  90.     print (mylist)
  91.  
  92. if __name__ == "__main__":
  93.     loop = asyncio.get_event_loop()
  94.     loop.run_until_complete(main())






logging




https://python101.pythonlibrary.org/chapter25_decorators.html


  1. import logging
  2.  
  3. def log(func):
  4.     """
  5.    Log what function is called
  6.    """
  7.     def wrap_log(*args, **kwargs):
  8.         name = func.__name__
  9.         logger = logging.getLogger(name)
  10.         logger.setLevel(logging.INFO)
  11.  
  12.         # add file handler
  13.         fh = logging.FileHandler("%s.log" % name)
  14.         fmt = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
  15.         formatter = logging.Formatter(fmt)
  16.         fh.setFormatter(formatter)
  17.         logger.addHandler(fh)
  18.  
  19.         logger.info("Running function: %s" % name)
  20.         result = func(*args, **kwargs)
  21.         logger.info("Result: %s" % result)
  22.         return func
  23.     return wrap_log
  24.  
  25. @log
  26. def double_function(a):
  27.     """
  28.    Double the input parameter
  29.    """
  30.     return a*2
  31.  
  32. if __name__ == "__main__":
  33.     value = double_function(2)


random模块

  1. >>>import random
  2.  
  3. random.random():生成一个介于0.01.0之间的随机浮点数,该函数不需要任何参数
  4. >>> random.random()
  5. 0.8085615496267344
  6.  
  7. random.randint():返回指定整数之间的随机整数。
  8. >>> random.randint(1, 100)
  9. 87
  10. >>> random.randint(1, 100)
  11. 56
  12.  
  13. random.randrange():从start,stop和step参数创建的范围中返回一个随机选择的元素。缺省情况下,start的值为0。同样,step的值默认为1
  14. >>>random.randrange(1, 10)
  15. 2
  16. >>>random.randrange(1, 10, 2)
  17. 5
  18. >>>random.randrange(0, 101, 10)
  19. 80
  20.  
  21. random.choice():从非空序列返回随机选择的元素。空序列作为参数会引发IndexError
  22. >>>random.choice('computer')
  23. 't'
  24. >>>random.choice([12, 23, 45, 67, 65, 43])
  25. 45
  26. >>>random.choice((12, 23, 45, 67, 65, 43))
  27. 67
  28.  
  29. random.shuffle():此函数对列表中的元素进行随机重新排序。
  30. >>>numbers=[12, 23, 45, 67, 65, 43]
  31. >>>random.shuffle(numbers)
  32. >>>numbers
  33. [23, 12, 43, 65, 67, 45]
  34. >>>random.shuffle(numbers)
  35. >>>numbers
  36. [23, 43, 65, 45, 12, 67]




查找哈希的源代码


  1. # Python rogram to find the SHA-1 message digest of a file
  2.  
  3. # importing the hashlib module
  4. import hashlib
  5.  
  6. def hash_file(filename):
  7.    """"This function returns the SHA-1 hash
  8.   of the file passed into it"""
  9.  
  10.    # make a hash object
  11.    h = hashlib.sha1()
  12.  
  13.    # open file for reading in binary mode
  14.    with open(filename,'rb') as file:
  15.  
  16.        # loop till the end of the file
  17.        chunk = 0
  18.        while chunk != b'':
  19.            # read only 1024 bytes at a time
  20.            chunk = file.read(1024)
  21.            h.update(chunk)
  22.  
  23.    # return the hex representation of digest
  24.    return h.hexdigest()
  25.  
  26. message = hash_file("track1.mp3")
  27. print(message)


Time

  1. # 时间比较
  2. import time
  3. n= 100000
  4.  
  5. start_time = time.time()
  6. l = []
  7. for i in range(n):
  8.     l = l + [i * 2]
  9. print(time.time() - start_time)
  10.  
  11. start_time = time.time()
  12. l = []
  13. for i in range(n):
  14.     l += [i * 2]
  15. print(time.time() - start_time)
  16.  
  17. start_time = time.time()
  18. l = []
  19. for i in range(n):
  20.     l.append(i * 2)
  21. print(time.time() - start_time)
  22.  
  23. # 数字时钟
  24. import time
  25. while True:
  26.   localtime = time.localtime()
  27.   result = time.strftime("%I:%M:%S %p", localtime)
  28.   print(result, end="", flush=True)
  29.   print("\r", end="", flush=True)
  30.   time.sleep(1)


timestamp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# cookie: PHPSESSID=reo7db3r3e44l8rj78bnfs9765; _ga=GA1.3.882780060.1625415841; _gid=GA1.3.326836998.1625415841; _gat=1

from datetime import datetime
dt = datetime.today()  # Get timezone naive now
seconds = dt.timestamp()
print(int(seconds))


ts = int("1625415841")
# if you encounter a "year is out of range" error the timestamp
# may be in milliseconds, try `ts /= 1000` in that case
print(datetime.utcfromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S'))

unix 时间戳是什么?

unix 时间戳是以运行总秒数来跟踪时间的一种方法。这个计数从 1970 年 1 月 1 日 UTC 的 Unix Epoch 开始。因此,unix 时间戳只是特定日期和 Unix Epoch 之间的秒数。还应该指出(感谢本网站访问者的评论),无论你位于世界何处,这个时间点在技术上都不会改变。这对于计算机系统在线和客户端的动态和分布式应用程序中跟踪和分类过时的信息非常有用。cookie中的十位数字



socket


  1. import socket
  2.  
  3. # working with a socket as a context manager
  4. with socket.socket() as client_socket:
  5.     hostname = '127.0.0.1'
  6.     port = 9090
  7.     address = (hostname, port)
  8.  
  9.     client_socket.connect(address)
  10.  
  11.     data = 'Wake up, Neo'
  12.     data = data.encode()
  13.  
  14.     client_socket.send(data)
  15.  
  16.     response = client_socket.recv(1024)
  17.  
  18.     response = response.decode()
  19.     print(response)

评论

此博客中的热门博文

自动发送消息

  # https://pyperclip.readthedocs.io/en/latest/ import pyperclip while True :     # pyperclip.copy('Hello, world!')     # pyperclip.paste()     # pyperclip.waitForPaste()     print ( pyperclip. waitForNewPaste ( ) )     # 获取要输入新的坐标,也可以通过autohotkey import time import pyautogui  as pag import os   try :     while True :         print ( "Press Ctrl-C to end" )         x , y = pag. position ( )   # 返回鼠标的坐标         posStr = "Position:" + str ( x ) . rjust ( 4 ) + ',' + str ( y ) . rjust ( 4 )         print ( posStr )   # 打印坐标         time . sleep ( 0.2 )         os . system ( 'cls' )   # 清楚屏幕 except KeyboardInterrupt :     print ( 'end....' )     # 打印消息 import pyautogui import time import pyperclip   content = """   呼叫龙叔! 第二遍! 第三遍! 第四遍...

学习地址

清华大学计算机系课程攻略 https://github.com/PKUanonym/REKCARC-TSC-UHT 浙江大学课程攻略共享计划 https://github.com/QSCTech/zju-icicles https://home.unicode.org/ 世界上的每个人都应该能够在手机和电脑上使用自己的语言。 http://codecanyon.net   初次看到这个网站,小伙伴们表示都惊呆了。原来代码也可以放在网上卖的?!! 很多coder上传了各种代码,每个代码都明码标价。看了下销售排行,有的19刀的卖了3万多份,额di神啊。可以看到代码的演示效果,真的很漂亮。代码以php、wordpress主题、Javascript、css为主,偏前台。 https://www.lintcode.com/ 算法学习网站,上去每天刷两道算法题,走遍天下都不怕。 https://www.codecademy.com/ 包含在线编程练习和课程视频 https://www.reddit.com/ 包含有趣的编程挑战题,即使不会写,也可以查看他人的解决方法。 https://ideone.com/ 在线编译器,可运行,可查看代码示例。 http://it-ebooks.info/ 大型电子图书馆,可即时免费下载书籍。 刷题 https://github.com/jackfrued/Python-100-Days https://github.com/kenwoodjw/python_interview_question 面试问题 https://github.com/kenwoodjw/python_interview_question https://www.journaldev.com/15490/python-interview-questions#python-interpreter HTTP 身份验证 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Authentication RESTful 架构详解 https://www.runoob.com/w3cnote/restful-architecture.html https://www.rosettacode.org/wiki/Rosetta_C...

mysql 入门

资料 https://dinfratechsource.com/2018/11/10/how-to-install-latest-mysql-5-7-21-on-rhel-centos-7/ https://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html https://www.runoob.com/mysql/mysql-create-database.html https://www.liquidweb.com/kb/install-java-8-on-centos-7/ 工具 https://www.heidisql.com/ HeidiSQL是免费软件,其目标是易于学习。 “ Heidi”使您可以从运行数据库系统MariaDB,MySQL,Microsoft SQL或PostgreSQL的计算机上查看和编辑数据和结构 MySQL 连接时尽量使用 127.0.0.1 而不是 localhost localhost 使用的 Linux socket,127.0.0.1 使用的是 tcp/ip 为什么我使用 localhost 一直没出问题 因为你的本机中只有一个 mysql 进程, 如果你有一个 node1 运行在 3306, 有一个 node2 运行在 3307 mysql -u root -h localhost -P 3306 mysql -u root -h localhost -P 3307 都会连接到同一个 mysql 进程, 因为 localhost 使用 Linux socket, 所以 -P 字段直接被忽略了, 等价于 mysql -u root -h localhost mysql -u root -h localhost 而 -h 默认是 localhost, 又等价于 mysql -u root mysql -u root 为了避免这种情况(比如你在本地开发只有一个 mysql 进程,线上或者 qa 环境有多个 mysql 进程)最好的方式就是使用 IP mysql -u root -h 127 .0 .0 .1 -P 3307 strac...