[教程] 在 Y 分钟内学会 Python

Posted 诺尔Null

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[教程] 在 Y 分钟内学会 Python相关的知识,希望对你有一定的参考价值。

在 Y 分钟内学会 Python

这是翻译, 原文地址: Learn Python in Y Minutes

在 90 年代初, Python 由 Guido van Rossum 创造, 现在, 它是最受欢迎的编程语言之一. 因其简明的语法, 我爱上了它. 语法基本上是可以执行的伪代码.

提示: 这篇文章适用于 Python 3, 如果你想要学习旧版 Python 2.7, 单击这里

# 单行注释以 '#' 作为开头

"""多行注释可以使用三个双引号
   并且经常用与书写文档
"""

####################################################
## 1. 原始数据类型和操作符
####################################################

# 你可以使用数字
3  # 等同于 3

# 数学运算也是你希望使用的形式
1 + 1  # 结果是 2
8 - 1  # 结果是 7
10 * 2  # 结果是 20
35 / 5  # 结果是 7.0

# 正负数的整除都会向下取整
5 // 3  # 结果是 1
-5 // 3  # 结果是 -2
5.0 // 3.0  # 结果是 1.0 # 在浮点运算中也同样生效
-5.0 // 3.0  # 结果是 -2.0

# 除法的运算结果始终是浮点数
10.0 / 3  # 结果是 3.3333333333333335

# 取模运算
7 % 3  # 结果是 1
# i % j 结果的符号与 j 相同, 这与 C 语言不同
-7 % 3  # 结果是 2

# 幂运算 (x**y, x的y次方)
2 ** 3  # 结果是 8

# 用括号来强制优先运算
1 + 3 * 2  # 结果是 7
(1 + 3) * 2  # 结果是 8

# 布尔值是基本数据类型
True  # 值为 真(true)
False  # 值为 假(false)

# 使用 not 来进行非运算
not True  # 结果是 假
not False  # 结果是 真

# 布尔值操作符:
# 提示, 'and' 和 'or' 是区分大小写的
True and False  # 结果是 假
False or True  # 结果是 真

# True 和 False 事实上也等同于 1 和 0, 只不过是使用了不同的关键字
True + True  # 结果是 2
True * 8  # 结果是 8
False - 5  # 结果是 -5

# 比较运算符会检查 True 和 False 的数字值
0 == False  # 结果是 真
1 == True  # 结果是 真
2 == True  # 结果是 假
-5 != False  # 结果是 真

# 对整数使用布尔逻辑操作符, 则会将它们转换为布尔值以求值,但返回未转换的值
# 不要把 bool(ints) 和 位运算 and/or 搞混了
bool(0)  # 返回 假
bool(4)  # 返回 真
bool(-6)  # 返回 真
0 and 2  # 返回 0
-5 or 0  # 返回 -5

# 运算符 '等同于' 是 ==
1 == 1  # 返回 真
2 == 1  # 返回 假

# 运算符 '不等于' 是 !=
1 != 1  # 返回 假
2 != 1  # 返回 真

# 更多比较运算符
1 < 10  # 返回 真
1 > 10  # 返回 假
2 <= 2  # 返回真
2 >= 2  # 返回真

# 检查一个值是否在指定范围内
1 < 2 and 2 < 3  # 返回 真
1 < 3 and 3 < 2  # 返回 假
# 连接起来, 这样看起来会更好看些
1 < 2 < 3  # 返回 真
2 < 3 < 2  # 返回 假

# (is 与 ==) is 将会检查两个变量是否引用了同一个对象, 但是 == 检查
# 两个对象是否指向了相同的值
a = [1, 2, 3, 4]  # 使 a 指向一个新的列表, [1, 2, 3, 4]
b = a  # 使 b 指向 a 所指向的对象
b is a  # 返回 真, a 和 b 引用的是同一个对象
b == a  # 返回 真, a 和 b 的对象是相等的
b = [1, 2, 3, 4]  # 使 b 指向一个新的列表, [1, 2, 3, 4]
b is a  # 返回 假, a 与 b 并不引用同一个对象
b == a  # 返回 真, a 和 b 的对象使相等的

# 字符串可以使用 双引号 " 或 单引号 ' 来创建
"这是一个字符串"
'这也是一个字符串'

# 字符串可以相加
"Hello " + "world!"  # 返回 "Hello world!"
"Hello " "world!"  # 等同于 "Hello world!"

# 字符串可以用作一个字符列表
"Hello world!"[0]  # 返回 'H'

# 你可以获取字符串的长度:
len("这是一个字符串")  # 返回 7

# 你可以使用 f-字符串 或 格式化字符串 来对字符串文本进行格式化 (在 Python 3.6 或更高版本)
name = "小红"
f"她说她的名字是{name}."  # 返回 "她说她的名字是小红."
# 你可以基本的将 Python 表达式放到括号内, 然后它就会被输出到字符串中.
f"{name}是{len(name)}字符长."  # 返回 "小红是两个字符长"

# None 是一个对象
None  # 返回 None

# 不要使用等同于运算符 '==' 来比较对象和 None
# 使用 'is' 来代替. 这个会检查对象标识是否相同.
"etc" is None  # 返回 假
None is None  # 返回 真

# None, 0, 以及空的字符串/列表/字典/元组, 都计算为 假
bool(0)  # => 假
bool('')  # => 假
bool([])  # => 假
bool({})  # => 假
bool(())  # => 假

####################################################
## 2. 变量和集合
####################################################

# Python 有一个 print 函数, 用于标准输出
print("我是Python, 很高兴见到你!")  # => 我是Python, 很高兴见到你!

# 默认的, print 函数还会在结尾输出一个换行符
# 使用可选参数 'end' 来改变末尾的字符串.
print("Hello, world", end="!")  # => Hello, world!   # 输出后没有换行

# 从控制台获取输入数据的简单方式:
input_string_var = input("Enter some data:")  # 以字符串的形式返回输入数据

# Python 中没有变量的声明, 只有赋值.
# 命名规范是使用小写以及下划线, 就像这样: lower_case_with_underscores
some_var = 5
some_var  # => 5

# 访问一个没有生命的变量是错误的
# 查看控制流来获取更多异常捕捉信息
some_unknown_var  # 这是一个一个未定义的变量, 运行时将抛出 NameError 异常

# if 也可用作一个表达式
# 等同于 C 语言中的 '?:' 三元运算符
"yay" if 0 > 1 else "nay!"  # => "nay"

# 列表可以存储一个序列, 可以这样定义:
li = []
# 你可以为其指定初始值
other_li = [4, 5, 6]

# 使用 append 方法在列表的末尾添加一些什么东西
li.append(1)  # 现在 li 的值是 [1]
li.append(2)  # 现在 li 的值是 [1, 2]
li.append(4)  # 现在 li 的值是 [1, 2, 4]
li.append(3)  # 现在 li 的值是 [1, 2, 4, 3]
# 使用 pop 方法从列表的末尾移除元素
li.pop()  # 返回 3, 并且现在 li 的值是 [1, 2, 4]
# 重新将它放回去
li.append(3)  # 现在 li 又变成 [1, 2, 4, 3] 了

# 像访问数组一样访问一个列表
li[0]  # => 1
# 访问列表的最后一个元素
li[-1]  # => 3

# 如果索引超出界限, 那么会抛出 IndexError 异常
li[4]  # 抛出 IndexError 异常

# 你可以使用切片语法来查看一个范围内的元素
# 起始索引包含在内, 但结束索引不包含在内
# (对于数学类型来讲, 它是一个 闭/开 区间)
li[1:3]  # 返回从索引1到3的一个列表 => [2, 4]
li[2:]  # 返回从索引2开始的列表 => [4, 3]
li[:3]  # 返回从开始到索引3的列表 => [1, 2, 4]
li[::2]  # 返回一个每两个元素选择一个的列表 => [1, 4]
li[::-1]  # 返回反向排列的列表 => [3, 4, 2, 1]
# 使用任意组合来实现高级切片
# li[起始:结束:步长]

# 使用切片来创建一个单层的深度拷贝
li2 = li[:]

# 使用 "del" 来删除任意元素
del li[2]  # 现在 li 的值是 [1, 2, 3]

# 删除第一个匹配值的元素
li.remove(2)  # 现在 li 的值是 [1, 3]
li.remove(2)  # 抛出 ValueError 异常, 2 并不在这个列表中

# 在指定索引处插入元素, 列表.insert(索引, 元素)
li.insert(1, 2)  # 现在 li 的值又是 [1, 2, 3] 了

# 获取第一个匹配元素的索引
li.index(2)  # => 1
li.index(4)  # 抛出 ValueError 异常, 4 不在这个列表中

# 你可以将列表相加
# 提示: values 和 other_li 的值不会被修改
li + other_li  # => [1, 2, 3, 4, 5, 6]

# 使用 "extend()" 连接列表, extend 的意思是拓展
li.extend(other_li)  # 现在 li 的值是 [1, 2, 3, 4, 5, 6]

# 使用 "in" 检查元素是否存在于列表中
1 in li  # => True

# 使用 "len()" 检查列表的长度
len(li)  # => 6

# 元组与列表相像, 但是不可更改
tup = (1, 2, 3)
tup[0]  # => 1
tup[0] = 3  # 抛出一个 TypeError

# 提示, 长度为一的元组的最后一个元素必须有一个逗号跟随, 但是
# 其他长度的元组, 尽管是0, 也不需要
type((1))  # => <class 'int'>
type((1,))  # => <class 'tuple'>
type(())  # => <class 'tuple'>

# 大多数的列表操作符都可以在元组上使用
len(tup)  # => 3
tup + (4, 5, 6)  # => (1, 2, 3, 4, 5, 6)
tup[:2]  # => (1, 2)
2 in tup  # => True

# 你可以将元组(或者列表)解包为变量
a, b, c = (1, 2, 3)  # 现在, a 是 1, b 是 2, c 是 3
# 你还可以使用拓展解包
a, *b, c = (1, 2, 3, 4)  # 现在, a 是 1, b 是 [2, 3], c 是 4
# 默认情况下, 即便你忽略括号, 也会创建一个元组
d, e, f = 4, 5, 6  # 元组 4, 5, 6 被解包为变量 d, e, f
# 变量值分别如下: d = 4, e = 5 以及 f = 6
# 那么看看交换两个值是多么的简单
e, d = d, e

# 字典用于存储从键到值的映射
empty_dict = {}  # 创建了一个空字典
# 下面是一个带有初始值的字典
filled_dict = {"one": 1, "two": 2, "three": 3}

# 提示: 字典的键必须是不可变的类型.  这是为了确保
# 键能够转换为用于快速查询的常量哈希值.
# 不可变类型包含整数, 浮点数, 字符串, 元组
invalid_dict = {[1, 2, 3]: "123"}  # 抛出 TypeError: unhashable type: 'list' 异常. (类型错误: 无法进行哈希化的类型: '列表')
valid_dict = {(1, 2, 3): [1, 2, 3]}  # 然而, 值可以是任何类型

# 使用 [] 来查询值
filled_dict["one"]  # => 1

# 使用 "keys()" 来获取所有的键并作为一个可迭代对象返回. 我们需要在 list() 中将调用结果转换
# 为一个列表. 这个稍后再讲. 提示 - 在 Python 低于 3.7 的版本中
# 字典键索引的顺序是无法保证的. 你的结果可能不与下面的例子完全相等. 然而, 在 Python 3.7 中, 字典
# 元素会保持它们被插入到字典的顺序
list(filled_dict.keys())  # => ["three", "two", "one"] 在低于 3.7 的 Python 版本中
list(filled_dict.keys())  # => ["one", "two", "three"] 在 3.7 或更高的 Python 版本中

# 使用 "values()" 来获取所有的值并作为可迭代对象返回. 同样, 我们需要将其在
# list() 中转换, 以取出这个可迭代对象的值. 提示 - 和上面键的顺序是一样的
list(filled_dict.values())  # => [3, 2, 1] 在低于 3.7 的 Python 版本中
list(filled_dict.values())  # => [1, 2, 3] 在 3.7 或更高的 Python 版本中

# 使用 "in" 来检查键是否在字典中
"one" in filled_dict  # => True
1 in filled_dict  # => False

# 通过不存在的键来查找字典, 会抛出 KeyError 异常
filled_dict["four"]  # KeyError

# 使用 "get()" 方法来避免 KeyError 异常
filled_dict.get("one")  # => 1
filled_dict.get("four")  # => None
# 这个方法支持当找不到值时返回指定的默认值
filled_dict.get("one", 4)  # => 1
filled_dict.get("four", 4)  # => 4

# "setdefault()" 只有在给定键不存在的时候将值插入到字典
filled_dict.setdefault("five", 5)  # filled_dict["five"] 被设置为了 5
filled_dict.setdefault("five", 6)  # filled_dict["five"] 仍然是 5

# 向字典中添加内容
filled_dict.update({"four": 4})  # => {"one": 1, "two": 2, "three": 3, "four": 4}
filled_dict["four"] = 4  # 向字典中添加的另一种方式

# 自 Python 3.5 以来, 你还可以使用拓展解包选项
{'a': 1, **{'b': 2}}  # => {'a': 1, 'b': 2}
{'a': 1, **{'a': 2}}  # => {'a': 2}

# 集合用来存储 ... 额, 集合
empty_set = set()  # 空集合
# 用一组值来初始化一个集合, 嗯, 看起来有点像字典, 抱歉
some_set = {1, 1, 2, 2, 3, 4}  # some_set 现在的值是 {1, 2, 3, 4}

# 与字典中的键相似, 集合的元素必须是不可变的
invalid_set = {[1], 1}  # => 抛出一个 TypeError: unhashable type: 'list' (类型错误: 无法进行哈希化的类型: '列表')
valid_set = {(1,), 1}

# 向集合中添加一个或多个条目
filled_set = some_set
filled_set.add(5)  # filled_set 现在是 {1, 2, 3, 4, 5}
# 集合是不包含重复元素的
filled_set.add(5)  # 还是与之前一样 {1, 2, 3, 4, 5}

# 使用 & 取交集
other_set = {3, 4, 5, 6}
filled_set & other_set  # => {3, 4, 5}

# 使用 | 取并集
filled_set | other_set  # => {1, 2, 3, 4, 5, 6}

# 使用 - 取差集
{1, 2, 3, 4} - {2, 3, 5}  # => {1, 4}

# 使用 ^ 取对称差集
{1, 2, 3, 4} - {2, 3, 5}  # => {1, 4, 5}

# 检查左侧的集合是否是右侧集合的超集
{1, 2} >= {1, 2, 3}  # => False

# 检查左侧的集合是否是右侧集合的子集
{1, 2} <= {1, 2, 3}  # => True

# 使用 in 来检查是否存在于集合中
2 in filled_set  # => True
10 in filled_set  # => False

# 生成一个单层的深层副本
filled_set = some_set.copy()  # filled_set 是 {1, 2, 3, 4, 5}
filled_set is some_set  # => False

####################################################
## 3. 控制流和可迭代对象
####################################################

# 首先我们声明一个变量
some_var = 5

# 这是一个 if 语句, 缩进在 Python 中非常重要
# 约定语法是使用四个空格, 而不是水平制表符(tab)
# 这个将会打印 "some_var 比 10 小"
if some_var > 10:
    print("some_var 比 10 大")
elif some_var < 10:  # 这个 elif 语句是可选的
    print("some_var 比 10 小")
else:  # 这个也是可选的
    print("some_var 与 10 相等")

"""
for 语句用来循环遍历列表
将会打印:
    狗是哺乳动物
    猫是哺乳动物
    老鼠是哺乳动物
"""
for animal in ["狗", "猫", "老鼠"]:
    # 你可以使用 format() 来插入格式化字符串
    print("{}是哺乳动物".format(animal))

"""
"range(数字)" 返回一个数字的可迭代对象
从0到给定数字
将会打印:
    0
    1
    2
    3
"""
for i in range(4):
    print(i)

"""
"range(较小的数, 较大的数)" 返回一个数字的可迭代对象
从较小的数字到较大的数字
将会打印:
    4
    5
    6
    7
"""
for i in range(4, 8):
    print(i)

"""
"range(较小的数, 较大的数, 步长)" 返回一个数字的可迭代对象
从较小的数到较大的数, 以步长未每次增长的值
如果步长没有指定, 默认值则是 1
将会打印:
    4
    6
"""
for i in range(4, 8, 2):
    print(i)

"""
循环一个列表, 并且同时检索列表中每一个条目的索引和值
将会打印:
    0 狗
    1 猫
    2 老鼠
"""
animals = ["狗", "猫", "老鼠"]
for i, value in enumerate(animals):
    print(i, value)

"""
while 循环将一直进行到条件不再满足为止
将会打印:
    0
    1
    2
    3
"""
x = 0
while x < 4:
    print(x)
    x += 1  # x = x + 1 的简写

# 使用 try/except 语句块来处理异常
try:
    # 使用 "raise" 来抛出异常
    raise IndexError("这是一个索引错误")
except IndexError as e:
    pass  # pass 只是一个占位符(不进行任何操作). 通常你需要在这里对异常进行处理
except (TypeError, NameError):
    pass  # 如果需要, 你可以同时处理多个异常.
else:  # try/except 语句块的可选语句. 必须在所有 except 语句块的后面
    print("一切正常!")  # 仅在 try 语句内没有任何异常时运行
finally:  # 在任何情况下都会执行
    print("我们可以在这里进行资源清理")

# 你可以使用 with 语句代替 try/finally 来清理资源
with open("我的文件.txt") as f:
    for line in f:
        print(line)

# 向文件中写入内容
contents = {"aa": 12, "bb": 21}
with open("我的文件1.txt", "w+") as file:
    file.write(str(content))  # 向文件中写入字符串

with open("我的文件2.txt", "w+") as file:
    file.write(json.dumps(content))  # 向文件中写入一个对象

# 从文件中读取
with open("我的文件1.txt", "r+") as file:
    contents = file.read()  # 从文件中读取一个字符串
print(contents)
# 打印: {"aa", 12, "bb": 21}

with open("我的文件2.txt", "r+") as file:
    contents = json.load(file)  # 从文件中读取一个json对象
print(contents)
# print: {"aa": 12, "bb": 21}


# Python 提供了一个叫做 Iterable(可迭代的) 的基本抽象
# 一个可迭代对象是一个可视为序列的对象
# range 函数返回的对象就是一个可迭代对象

filled_dict = {"one": 1, "two": 2, "three": 3}
our_iterable = filled_dict.keys()
print(our_iterable)  # => dict_keys(['one', 'two', 'three']). 这是一个实现了 Iterable 接口的对象

# 我们可以检索它
for i in our_iterable:
    print(i)  # 打印 one, two, three

# 然而, 我们不可以通过索引来找到元素
our_iterable[1]  # 抛出 TypeError 异常

# 一个可迭代对象即为能够创

以上是关于[教程] 在 Y 分钟内学会 Python的主要内容,如果未能解决你的问题,请参考以下文章

快速入门:十分钟学会Python

快速入门:十分钟学会Python

快速入门:十分钟学会Python

快速入门:十分钟学会Python

快速入门:十分钟学会Python

快速入门:十分钟学会Python