一、赋值魔法
# 1、序列解包,同时给多个变量赋值,序列可以是元组和列表
# 要解包的序列包含的元素个数必须与你在等号左边列出的目标个数相同
x, y, z = 1, 2, 3 # 1
x, y = y, x # 2
values = 1, 2, 3
x, y, z = values # 3
# 从字典中随机获取(或)删除一个键值对,可使用方法popitem
# 它随便获取一个键值对并以元组返回
d = {'name': 'python', 'title': 'study'}
key, value = d.popitem() # 4
# 可以使用*来收集多余的值,带*号的变量最终包含的是一个列表
# 也可以将*放在别的地方
x, y, *rest = (1, 2, 3, 4) # 5
print(rest) # [3, 4]
# 如果把*放在y上,就会显示[2, 3]
# 2、链式赋值,用于将多个变量关联到同一个值
# x = y = somefunction()
# 等价于:x = somefuncton() y = x
# 不等价于:x = somefuncton() y = somefuncton()
# 3、增强赋值
x = 2
x += 1
x *= 2
二、代码块
代码块不是一种语句,是一组语句,可在满足条件时执行(if),可多次执行(循环)…
代码块是通过缩进代码来创建的。
三、条件和条件语句
- 有条件执行和if语句
- else子句
- elif子句
- 代码块嵌套(就是使用多个if else elif语句)
下面说一下更复杂的条件和断言。
3.1比较运算符
下面介绍几个特殊的
x is y | x和y是同一个对象 |
---|---|
x is not y | x和y不是同一个对象 |
x in y | x是容器(如序列)y的成员 |
x not in y | x不是容器(如序列)y的成员 |
# is和==的区别
x = y = [1, 2, 3]
z = [1, 2, 3]
print('x == y:', x == y) # True
print('x == z:', x == z) # True
print('x is y:', x is y) # True
print('x is z:', x is z) # False
3.2断言
if语句有一个很有用的“亲戚”,其工作原理类似于下面的伪代码:
if not condation:
crash program
编写类似于这样的代码的原因是:让程序在错误条件出现时立即崩溃胜过以后再崩溃。
所以使用断言,关键字是assert
# 断言assert,充当检查点
# 如果满足条件,就会正常运行
age = 10
assert 0 < age < 100
# 如果不满足,就会立即崩溃
age = -1
# assert 0 < age < 100
# AssertionError
# 还可以在条件后面添加一个字符串,对断言作出说明
# assert 0 < age < 100, 'The age mush be realistic'
# AssertionError: The age mush be realistic
四、循环
1. while循环
x = 1
while x <= 10:
print(x)
x += 1
# 当要求输入名字的时候直接回车,会继续提示你输入。
name = ''
while not name:
name = input('Please input your name:')
print('Hello, {}!'.format(name))
2. for循环
numbers = [1, 2, 3, 4]
for number in numbers:
print(number)
# 由于迭代(也就是遍历)特定范围内的数是一种常见的任务
# python提供了一个内置函数range
a = range(0, 10) # 从0到10,但是不包含10
a = list(a)
print(a)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 和上面的结果一样
for number in range(1, 5):
print(number)
3. 迭代字典
# 遍历字典的所有关键字
d = {'x': 1, 'y': 2}
# 遍历键
for key in d.keys():
print(key, ':', d[key])
# 遍历值
for value in d.values():
print(value)
4. 一些迭代工具
- 并行迭代,zip
# 并行迭代工具,内置函数zip
# 它将两个序列“缝合”起来,并返回一个由元组组成的序列
# 返回值是一个合适迭代的对象
# 查看它的内容,需要使用list将其转换为列表
names = ['a', 'b', 'c']
ages = [1, 2, 3]
a = list(zip(names, ages))
print(a)
# 使用zip进行并行遍历
for name, age in zip(names, ages):
print(name, age)
- 迭代时获取索引,enumerate
有些时候,需要在迭代对象序列的同时获取当前对象的索引。
# 迭代时获取索引,内置函数enumerate
strings = ['aabbcc', 'bbaacc', 'ccaabb', 'aaccbb', 'bbccaa', 'ccbbaa']
# 通过内置函数enumerate,可以获取索引-值
for index, string in enumerate(strings):
if 'ab' in string:
strings[index] = 'update'
print(strings)
# ['update', 'bbaacc', 'update', 'aaccbb', 'bbccaa', 'ccbbaa']
- 反向迭代和排序后再迭代
可用于任何序列或可迭代的对象,且不就地修改对象,而是返回反转和排序后的版本。
# 排序后再迭代,内置函数sorted,类似于列表方法sort
string = 'Hello World!'
a = sorted(string) # sorted返回的是一个列表
b = list(reversed(string)) # reversed返回的是一个可迭代对象,要将其转换为列表
print(a)
print(b)
# !HWdellloor
# !dlroW olleH
5.跳出循环
- break
- continue
- while True/break成例
6.循环中的else子句
如何判断循环提前结束还是正常结束?
一种方法是在循环开始前定义一个布尔变量,并将其设置为false,在跳出循环时将其设置为true。
第二种方法,也是更简单的方法是在循环中田间一条else子句,它仅在没有调用break时才执行。
# 循环中的else子句
for n in range(99, 80, -1):
root = sqrt(n)
if root == int(root):
print(n)
break
else:
print("Don't find it!")
如果没有break,正常结束,那么就会输出Don’t find it!。
五、简单推导
列表推导是一种从其他列表创建列表的方式。
# 简单推导
a = [x*x for x in range(0, 10)]
print(a)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 将名字首字母相同的男孩和女孩配对
girls = ['alice', 'bernice', 'clarice']
boys = ['chris', 'arnold', 'bob']
letterGirls = {}
for girl in girls:
letterGirls.setdefault(girl[0], []).append(girl)
# letterGirls.setdefault(girl[0], [girl])两者功能一样
print(letterGirls)
# {'a': ['alice'], 'b': ['bernice'], 'c': ['clarice']}
# 从男孩开始,通过男孩名字的首字母,在字典中找到相同首字母的女孩进行配对
gb = [b + '+' + g for b in boys for g in letterGirls[b[0]]]
print(gb)
使用圆括号代替方括号并不能实现元组推导,而是将创建生成器。然而,可使用花括号来推导字典推导
六、三人行
- pass
- del
- exec
# pass,什么都不做
# 编写代码时,可将其用作占位符
name = 'b'
if name == 'a':
print('a')
elif name == 'b':
# 这里的功能没有实现,可以使用pass
pass
else:
print('c')
# ---------------------------
# del删除
# 对于你不再使用的对象,python通常会将其删除
# 因为没有任何变量或数据结构成员指向它
# 这时python解释器会直接将其删除(垃圾收集)
a = [1, 2, 3]
b = a
b = None
print(a)
a = None
# [1, 2, 3]
# 另一种就是使用del语句
a = [1, 2, 3]
b = a
del a
# a和b指向同一个列表,但是删除a以后对b没有任何影响
print(b)
# [1, 2, 3]
# --------------------------------
# exec和eval,执行字符串及计算其结果
# 执行存储在字符串中的python代码,会存在严重的安全隐患
# exec,将字符串作为代码执行
exec("print('Hello World!')")
# 还应向它传递一个命名空间,用于放置变量的地方
# 否则代码会污染你弟命名空间,即修改你的变量
exec('sqrt = 1', scope)
scope['sqrt']
# eval,一个类似于exec的内置函数。
# 用于计算字符串表示的python表达式的值,并返回结果
a = eval(input("Enter an arithmetic expression:"))
print(a)
# Enter an arithmetic expression:99 * 66 + 2 -100
# 6436