<jupyter_start><jupyter_text>1.6 条件语句<jupyter_code># 例子
def isNegative(num):
    if num < 0:
        print("%d 是一个负数" % num)
    elif num == 0:
        print("%d 等于 0" % num)
    else:
        print("%d 是一个正数" % num)
        
isNegative(-23)
isNegative(0)
isNegative(242)
# 条件运算符
def isOdd(num):
    return ("%d 是一个奇数" if num % 2 == 1 else "%d 不是一个奇数") % num

print(isOdd(241))
print(isOdd(8832))
# 另一个条件运算符的例子
var = 100
var += 1 if var % 2 == 0 else -1
print(var)
# 实际上，条件运算符也可以嵌套使用，但是会让代码的可读性变差<jupyter_output>101<jupyter_text>1.7 循环语句<jupyter_code># 遍历字符串
for letter in 'python':
    print(letter, end=' ')
else:
    print('\n-- end of for loop --')

# 遍历列表
fruits = ['banana', 'apple', 'mango']
for fruit in fruits:
    print(fruit, end=' ')
print()

# 下标遍历列表
for i in range(len(fruits)):
    print(fruits[i], end=' ')
print()

# 遍历内容为序列的列表
# tuple
prices = {'banana': 1, 'apple': 2, 'mango': 3}
print(prices.items())
for (fruit, price) in prices.items():
    print('%s: %d' % (fruit, price))
# list
data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for (a, b, c) in data:
    print(a * b - c, end=' ')
print()
    
# 同时遍历多个列表（此处的 prices.keys() 与 prices.values() 都是列表）
for (fruit, price) in zip(prices.keys(), prices.values()):
    print('%s: %d' % (fruit, price))
    
# 反向遍历列表
for fruit in reversed(fruits):
    print(fruit, end=' ')
print()
# 某些算法题中可能需要用到这种遍历技巧
for i in range(len(fruits)-1, -1, -1):
    print(fruits[i], end=' ')
print()
for i in reversed(range(len(fruits))):
    print(fruits[i], end=' ')
print()
    
# 按序遍历列表
for fruit in sorted(fruits):
    print(fruit, end=' ')
print()
for fruit in sorted(fruits, reverse=True):
    print(fruit, end=' ')
print()
# 按序遍历的彩蛋

# key 用来进行比较的元素，只有一个参数，具体的函数的参数就是取自于可迭代对象中，指定可迭代对象中的一个元素来进行排序。
nums = [5, 7, 6, 3, 4, 1, 2]
# 奇数在前，偶数在后
print(sorted(nums, key=lambda lhs: lhs % 2 == 0))

# 按照最后一个字符进行排序
fruits = ['banana', 'apple', 'mango']
print(sorted(fruits, key=lambda lhs: lhs[-1]))

# 按照多个条件自定义排序
# 由于 key 只能使用一个参数来进行比较，我们需要调用 cmp_to_key 来支持使用多个参数进行比较
from functools import cmp_to_key
# 奇数在前，偶数在后；同奇偶性时，升序
# cmp 函数的返回值为整型：-1 代表小于；0 代表等于；1 代表大于
def cmp(lhs, rhs) -> int:
    # 同奇偶性时，升序排序
    if lhs % 2 == rhs % 2:
        return (rhs < lhs) - (lhs < rhs)
    # 异奇偶性时，奇数在前，偶数在后
    else:
        return rhs % 2 - lhs % 2
print(sorted(nums, key=cmp_to_key(cmp)))
class Vector2:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __str__(self):
        return "(%d, %d)" % (self.x, self.y)
    
# 按属性进行排序
vectors = [Vector2(1, 2), Vector2(3, 4), Vector2(0, 5), Vector2(1, 0), Vector2(6, -1)]
# 按 x 升序排序
for v in sorted(vectors, key=lambda lhs: lhs.x):
    print(v, end=' ')
print()

# 按多个属性进行排序
from functools import cmp_to_key
# 按 x 升序排序；x 相等时，按 y 升序排序
for v in sorted(vectors, key=cmp_to_key(lambda lhs, rhs: (rhs.x < lhs.x) - (lhs.x < rhs.x) or (rhs.y < lhs.y) - (lhs.y < rhs.y))):
    print(v, end=' ')
print()
# 循环控制语句
for i in range(100):
    if i > 10:
        break
    elif i % 2 == 0:
        continue
    else:
        pass
    print(i)
else:
    # 使用 break 终止循环时，不执行 else
    print('-- end of for loop --')
# while 循环
count = 0
while count < 10:
    print(count)
    count += 1
else:
    print('-- end of while loop --')<jupyter_output>0
1
2
3
4
5
6
7
8
9
-- end of while loop --
{'fraction_non_alphanumeric': 0.17611026033690658, 'fraction_numerical': 0.030934150076569678, 'mean_word_length': 3.1711366538952745, 'pattern_counts': {'":': 0, '<': 15, '<?xml version=': 0, '>': 9, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '2', 'dir': 'jupyter-structured-clean-dedup', 'id': '157895', 'license': 'MIT', 'n_tokens_mistral': 1722, 'n_tokens_neox': 1750, 'n_words': 381, 'path': 'chapter-1/chapter-1-6~7.ipynb', 'repo_name': 'Eros-L/Notebook', 'size': '3265'}