数据类型与运算符
数据类型:整型、浮点型、布尔型、字符串、列表、元组、集合、字典
运算符:算术、赋值、比较、逻辑、成员、恒等运算符
内置函数、复合数据结构、类型转换
空格和样式指南
我们需要注意两种类型的错误
异常
语法错误
异常是代码运行时发生的问题,而语法错误是 Python 在运行代码之前检查代码时发现的问题。
-
整型:
-
浮点型:
-
布尔型:
-
字符串:
len() 只能计算字符串长度,不能计算int float
类型转换
方法: 方法与特定变量中的数据类型相关。 方法相当于通过.来调用的一种函数。
每个方法都接受字符串本身作为该方法的第一个参数。但是,它们还可以接收其他参数。 -
列表
访问单个元素: 在 python 中,所有有序容器(例如列表)的起始索引都是 0。 你可以通过使索引减1 或是 -1 获取最后一个元素。
切片: 通过索引切掉字符串或列表中的某部分. 起始索引包含在内,终止索引排除在外。
函数: len(list) min(list) max(list) sorted(list, reverse=False)
list.append(str or int or float)
str.join(list) Join 是一个字符串方法,将字符串列表作为参数,并返回一个由列表元素组成并由分隔符字符串分隔的字符串。
下图展示了python基本的数据类型 可变性 有序性的分布情况:
-
元组 tuple
不可变有序元素数据类型
元组还可以用来以紧凑的方式为多个变量赋值。
dimensions = 52, 40, 100
type(dimensions) --> tuple
dimensions = 52, 40, 100
length, width, height = dimensions #元组解包
- set 集合
集合是一个包含唯一元素的可变无序集合数据类型。集合的一个用途是快速删除列表中的重复项。
和列表相似,你可以使用 add 方法将元素添加到集合中,并使用 pop 方法删除元素。
- dict 字典
字典的键可以是任何不可变类型,例如整数或元组,而不仅仅是字符串。
elements = {"hydrogen": 1, "helium": 2, "carbon": 6}
print(elements["helium"]) # print the value mapped to "helium"
elements["lithium"] = 3 # insert "lithium" with a value of 3 into the dictionary
控制流
判断 和 循环 两种控制流处理
if elif else
if season == 'spring':
print('plant the garden!')
elif season == 'summer':
print('water the garden!')
else:
pass
复杂的布尔表达式, 可能会出现 and or not 以及各种运算\括号等, 不管多复杂, if后的条件必须是布尔表达式, 来决定后续缩进代码是否执行.
注意事项:
- 不要使用if True 或者 if False, 否则会始终运行.
- 在使用逻辑运算符编写表达式 and or not, 多加小心
#Bad example 此代码条件一直是True
weather = "weqw"
if weather == "snow" or "rain": # "rain" 代表了True
print("Wear boots!")
- 不要使用布尔对象==True 或 ==False, 没有必要, 布尔对象本身就代表了True False
真假值测试:
if 语句中使用非布尔对象代替布尔表达式,Python 将检查其真假值
以下都被视为False对象, 除此以为都是True
- 定义为 false 的常量:None 和 False
- 任何数字类型的零:0、0.0、0j、Decimal(0)、Fraction(0, 1)
- 空序列和空集合:””、()、[]、{}、set()、range(0)
for 循环
再循环处理时, 有时需要创建新的列表, 对原有列表做修改.
names = ["Joey Tribbiani", "Monica Geller", "Chandler Bing", "Phoebe Buffay"]
usernames = [] # 这里只能建立新的列表
for name in names:
usernames.append(name.lower())
print(usernames)
# 不能对原列表做修改 以下的代码不起作用
for name in names:
name = name.lower().replace(" ", "_")
print(names) # 这里的names不会发生变化
# 这里可以使用range
for i in range(len(names)):
names[i] = names[i].lower().replace(" ", "-")
print(names) #这里可以不创建新列表,在原有列表做修改
有时也可以不创建新的列表, 使用range, 可以对原有列表做修改
再举一个例子
# 练习:创建 HTML 列表
items = ['first string', 'second string']
html_str = '<ul>'
for i in items:
html_str += '\n<li>'+i+'</li>'
html_str += '\n</ul>'
print(html_str)
# 结果如下
<ul>
<li>first string</li>
<li>second string</li>
</ul>
while
举个栗子
写一个 while 循环,用于计算比整数 limit 小的最大平方数,并将其存储在变量 nearest_square 中。平方数是整数乘以自己后的积,例如 36 是一个平方数,因为它等于 6*6。
例如,如果 limit 是 40,你的代码应该将 nearest_square 设为 36。
limit = 40
i = 0
while (i+1)**2 < limit:
i += 1
nearest_square = i**2
print(nearest_square)
Break、Continue
有时候我们需要更精准地控制何时循环应该结束,或者跳过某个迭代。在这些情况下,我们使用关键字 break 和 continue,这两个关键字可以用于 for 和 while 循环。
- break 使循环终止
- continue 跳过循环的一次迭代
举个栗子:
用 break 语句写一个循环,用于创建刚好长 140 个字符的字符串 news_ticker。你应该通过添加 headlines 列表中的新闻标题创建新闻提醒,在每个新闻标题之间插入空格。如果有必要的话,将最后一个新闻标题从中间截断,使 news_ticker 刚好长 140 个字符。
headlines = ["Local Bear Eaten by Man",
"Legislature Announces New Laws",
"Peasant Discovers Violence Inherent in System",
"Cat Rescues Fireman Stuck in Tree",
"Brave Knight Runs Away",
"Papperbok Review: Totally Triffic"]
news_ticker = ""
for i in headlines:
news_ticker += i + " "
if len(news_ticker) > 140:
news_ticker = news_ticker[:140]
break
print(news_ticker)
print(len(news_ticker))
Zip and Enumerate
练习:
使用 zip 写一个 for 循环,该循环会创建一个字符串,指定每个点的标签和坐标,并将其附加到列表 points。每个字符串的格式应该为 label: x, y, z。例如,第一个坐标的字符串应该为 F: 23, 677, 4。
x_coord = [23, 53, 2, -12, 95, 103, 14, -5]
y_coord = [677, 233, 405, 433, 905, 376, 432, 445]
z_coord = [4, 16, -6, -42, 3, -6, 23, -1]
labels = ["F", "J", "A", "Q", "Y", "B", "W", "X"]
points = []
tmp = zip(labels,x_coord,y_coord,z_coord)
for point in tmp:
points.append("{}: {},{},{}".format(*point))
for point in points:
print(point)
练习:将列表组合成字典
cast_names = ["Barney", "Robin", "Ted", "Lily", "Marshall"]
cast_heights = [72, 68, 72, 66, 76]
cast = dict(zip(cast_names, cast_heights))
print(cast)
练习:拆封元组 zip(*)
cast = (("Barney", 72), ("Robin", 68), ("Ted", 72), ("Lily", 66), ("Marshall", 76))
names, heights = zip(*cast)
print(names)
print(heights)
练习:Enumerate
cast = ["Barney Stinson", "Robin Scherbatsky", "Ted Mosby", "Lily Aldrin", "Marshall Eriksen"]
heights = [72, 68, 72, 66, 76]
for i, height in enumerate(heights):
cast[i] += " "+str(height)
print(cast)
列表推导式
[city.title() for city in cities]
列表推导式中的条件语句
可以向列表推导式添加条件语句, 放在可迭代对象之后, 可使用if
squares = [x**2 for x in range(9) if x % 2 == 0]
但是, 如果你要添加else,
则需要将条件语句移到列表推导式的开头,直接放在表达式后面
squares = [x**2 if x % 2 == 0 else x+3 for x in range(9) ]
# 练习:提取名字
names = ["Rick Sanchez", "Morty Smith", "Summer Smith", "Jerry Smith", "Beth Smith"]
first_names = [ name.split(" ")[0].lower() for name in names]
print(first_names)