compile()
# compile()_39
"""
compile()
compile(source, filename, mode[, flags[, dont_inherit]])
compile() 函数将一个字符串编译为字节代码。
source -- 字符串或者AST(Abstract Syntax Trees)对象。。
filename -- 代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。
mode -- 指定编译代码的种类。可以指定为 exec, eval。
flags -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。。
flags和dont_inherit是用来控制编译源码时的标志
"""
# 将语句转换为字节码文件,exec() 函数能运行该字节码文件
var0 = compile('print("I Love You.")', '', 'exec') # <code object <module> at 0x03420548, file "", line 1>
exec(var0) # I Love You.
# 将该字符串转换为字节码文件,eval() 函数能将该字节码文件的结果计算出来
var1 = compile('10 * 10', '', 'eval') # <code object <module> at 0x034A05A0, file "", line 1>
eval(var1) # 100
Link:菜鸟教程_compile()
eval()
# eval()_39
"""
eval()
eval(expression[, globals[, locals]])
eval() 函数用来执行一个字符串表达式,并返回表达式的值。
"""
# 可以吧 str 转换为 int 型
num0 = eval('100') # 相当于 int('100')
# ================================================================== #
# eval() 中不允许有以0开头的数值:SyntaxError: invalid token
# ================================================================== #
# eval('0100') # int('0100') 不报错
# 能计算 str 里的值
num1 = eval('10 * 10') # 100
# 当 str 的表达式为 num1, num2, ...,能做解包操作
num2, num3 = eval('100, 200') # 类似 (100, 200).split(',')
# 可用于值的输入操作
# 注意数值间使用 ',' 分隔
num4, num5 = input("请输入两个数:")
# 类似的可以写为
num6, num7 = map(int, input("请输入两个数值:").split(','))
Link:菜鸟教程_eval()
filter()
# filter()_35
"""
filter()
filter(function, iterable)
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,\
\ 然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
"""
def is_not_0(args):
return True if args is not 0 else False
# 筛出0
iter0 = filter(is_not_0, [2, 5, 0, 9, 6, 0, 7]) # <filter object at 0x035FCAF0>
# 简单实现filter()
def new_filter(function, iterable):
result = []
# 将返回 True 的元素放到新列表中
for element in iterable:
if function(element):
result.append(element)
return result
iter1 = new_filter(is_not_0, [2, 5, 0, 9, 6, 0, 7]) # [2, 5, 9, 6, 7]
Link:菜鸟教程_filter()
map()
# map()_35
"""
map()
map(function, iterable, ...)
map() 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
"""
def add_one(args):
# args add one and returns
return args + 1
iter1 = map(add_one, range(10)) # <map object at 0x039BC870>
iter1 = list(iter1) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# ========================================================================================= #
# 不报错当进行输出时报:TypeError: add_one() takes 1 positional argument but 2 were given
# ========================================================================================= #
iter2 = map(add_one, [0, 1, 2, 3], [1, 2, 3, 4]) # <map object at 0x03ADCAF0>
def new_add_one(args0, args1):
args0 += 1
args1 += 1
# ========================================================================================= #
# map() 得到的值由参数一中的函数所确定,输出得到:[None] * 4
# ========================================================================================= #
iter3 = map(new_add_one, range(4), range(1, 5)) # <map object at 0x03DECF70>
def over_add_one(args0, args1):
return args0 + 1, args1 + 1
iter4 = map(over_add_one, range(4), range(1, 5)) # 输出得到 [(1, 2), (2, 3), (3, 4), (4, 5)]
# 可以使用 map() 构成简单的 zip(),利用 map() 多序列传参的特点
def zip_func(args0, args1):
return (args0, args1) # 括号可有可无
iter5 = list(map(zip_func, range(10), range(10))) # [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9)]
# 也可以使用匿名函数
iter6 = list(map(lambda x, y: (x, y), range(10), range(10)))
Link:菜鸟教程_eval()
range()
# range()_37
"""
range()
range(start, stop[, step])
python range() 函数可创建一个整数列表,一般用在 for 循环中。
"""
# 长度为:10
iter0 = range(10)
# 开始值:5
iter1 = range(5, 10)
# 步长为:2
iter2 = range(0, 10, 2)
Link:菜鸟教程_range()
zip()
# zip()_38
"""
zip()
zip([iterable, ...])
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
"""
iter0 = zip(range(10), range(10, 0, -1)) # <zip object at 0x0318F440>
iter1 = zip(*iter0) # <zip object at 0x035EDEB8>
iter1 = list(iter1) # [(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), (10, 9, 8, 7, 6, 5, 4, 3, 2, 1)]
Link:菜鸟教程_zip()
reduce()
# reduce()_35
from functools import reduce
"""
reduce() # functools
reduce(function, iterable[, initializer])
reduce() 函数会对参数序列中元素进行累积。
函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,\
\ 得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
"""
def x_add_y(args0, args1):
return args0 + args1
# 执行过程:先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
iter0 = reduce(x_add_y, range(10)) # 类似 sum(range(-10))
# 使用匿名函数
iter1 = reduce(lambda x, y: x + y, range(10))
Link:菜鸟教程_reduce()
例子
# 2.5_39
from math import (cos, sqrt, pi)
# 1
# 用户输入一个三位自然数,计算并输出其百位,十位,个位上的数字。
def HDU():
# 直接求值
num = int(input("请输入一个三位自然数:"))
hundred, decade, unit = num // 100, num // 10 % 10, num % 10 # 求百位,十位,个位
# 使用 divmod() 函数
"""
divmod()
divmod(a, b)
函数接收两个数字类型(非复数)参数,返回一个包含商和余数的元组(a // b, a % b)
如果参数 a 与 参数 b 都是整数,函数返回的结果相当于 (a // b, a % b)。
如果其中一个参数为浮点数时,函数返回的结果相当于 (q, a % b),q 通常是 math.floor(a / b),但也有可能是 1 ,比小,不过 q * b + a % b 的值会非常接近 a。
如果 a % b 的求余结果不为 0 ,则余数的正负符号跟参数 b 是一样的,若 b 是正数,余数为正数,若 b 为负数,余数也为负数,并且 0 <= abs(a % b) < abs(b)。
"""
# hundred, temp = divmod(num, 100)
# decade, unit = divmod(temp, 10)
# =========================================================================================================================================================== #
# 使用 map() 函数
# =========================================================================================================================================================== #
# hundred, decade, unit = map(int, num)
return {'输入': num, '百位': hundred, '十位': decade, '个位': unit} # 返回字典
# 2
# 已知三角形的两边长及其夹角,求第三边长
def third_side():
fir_side, sec_side, angle = map(float, input("请输入两条边及其夹角:"))
thi_side = sqrt(fir_side ** 2 + sec_side ** 2 - 2 * fir_side * sec_side * cos(angle * (pi / 180)))
return "第三边长为:" + str(thi_side)
# 3
# 任意输入三个英文单词,按照字典顺序依次输出
def order_word():
fir_word, sec_word, thi_word = input("请输入三个英文单词:").split(',')
min_len = min([len(fir_word), len(sec_word), len(thi_word)])
fir_num, sec_num, thi_num = 0, 0, 0
for i in range(min_len):
if fir_word[i] < sec_word[i]:
fir_num += 1
else:
sec_num += 1
if fir_word[i] < thi_word[i]:
fir_num += 1
else:
thi_num += 1
if sec_word[i] < thi_word[i]:
sec_num += 1
else:
thi_num += 1
if fir_num > sec_num > thi_num:
return {'fir_word': fir_word, 'sec_word': sec_word, 'thi_word': thi_word}
if fir_num > thi_num > sec_num:
return {'fir_word': fir_word, 'sec_word': thi_word, 'thi_word': sec_word}
if sec_num > fir_num > thi_num:
return {'fir_word': sec_word, 'sec_word': fir_word, 'thi_word': thi_word}
if sec_num > thi_num > fir_num:
return {'fir_word': sec_word, 'sec_word': thi_word, 'thi_word': fir_word}
if thi_num > fir_num > sec_num:
return {'fir_word': thi_word, 'sec_word': fir_word, 'thi_word': sec_word}
if thi_num > sec_num > fir_num:
return {'fir_word': thi_word, 'sec_word': sec_word, 'thi_word': fir_word}
# =========================================================================================================================================================== #
# 使用 sorted() 函数
# =========================================================================================================================================================== #
# fir_word, sec_word, thi_word = sorted([fir_word, sec_word, thi_word])
# return {'fir_word': fir_word, 'sec_word': sec_word, 'thi_word': thi_word}