内置函数、匿名函数

一、内置函数

作用域相关:locals()、globals(),点击查看

其他:eval、exec、dir、input、print、hash、open、__import__、compile

  • eval和exec都可以执行字符串类型的代码
  • eval有返回值:适合有结果的计算
  • exec没有返回值:适合流程控制
eval("print(1+2)")    # 3
exec("print(1+2)")    # 3
print(eval("1+2"))    # 3
print(exec("1+2"))    # None

dir():函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。

# 查看使用方法
print(dir())
print(dir([]))
print(dir(str))

input():函数接受一个标准输入数据,返回为string(字符串)类型

print():打印

print(*args, sep = " ", end = "\n", file = sys.stdout, flush = False)
# 将对象打印到文本流文件,以sep分隔,然后结束。sep,end,file和flush(如果存在)必须作为关键字参数给出。
  sep:  打印多个值之间的分隔符,默认为空格
  end:  每一次打印的结尾,默认为换行符
  file: 默认是输出到屏幕,如果设置为文件句柄,输出到文件
  flush:立即把内容输出到流文件,不作缓存

print("AB", "CD", sep="|")    #AB|CD

print(11, end="")
print(22)    #1122

print(11, end=" ")
print(22)    #11 22

with open("1.txt", "w", encoding="utf-8") as f:
    print(11, 22, sep="-", file=f, flush=True) # 文件里写入了11-22
# 打印进度条
import time

for i in range(0, 101, 2):
    time.sleep(0.1)
    symbol_num = i // 2
    progress_str = "\r{}%  {}\n".format(i, "#"*symbol_num) if i == 100 else "\r{}%  {}".format(i, "#"*symbol_num)
    print(progress_str, end=" ")
    # 100%  ##################################################

hash(object):返回object的哈希值(如果有的话)

print(hash(123))        # 123
print(hash("pd"))       # 1092457194709355922
print(hash(True))       # 1
print(hash(False))      # 0
print(hash((1, 2, 3)))  # 2528502973977326415
# print(hash([1, 2, 3]))# 不可哈希,报错

 open():打开文件并返回相应的文件对象,比如返回给句柄f。

 compile():compile(source,filename,mode)

source
  # 字符串或者AST(Abstract Syntax Trees)对象 filename
  # 代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。当传入了source参数时,filename参数传入空字符即可 model
  # 指定编译代码的种类,可以指定为
'eval','exec','single';当source中只包含一个简单的求值表达式,model应指定为'eval';当source中包含流程语句时,model应指定为'exec';当source中包含了交互式命令语句,model应指定为'single'
# 简单求值用eval
s = "1 + 2"
c = compile(s, "", "eval")
print(eval(c))  # 3

# 流程语句使用exec
s= "for i in range(1, 6):print(i)"
c = compile(s, "", "exec")
print(eval(c))

# 交互语句用single
c = "name = input('please input your name:')"
c = compile(c, "", "single")
# print(name)  # exec(c)执行前,name变量还没被定义,报错
exec(c)        # 执行时显示交互命令,提示输入
print(name)    # exec(c)执行后,name变量有值

迭代器、生成器:range、next、iter

range():创建一个整数对象,一般用在 for 循环中

iter(iterable):将可迭代对象转化为迭代器

from collections import Iterable
from collections import Iterator
lis1
= [1,2,3] print(isinstance(lis1,Iterable)) # True print(isinstance(lis1,Iterator)) # False
lis2 = iter(lis1) print(isinstance(lis2,Iterable)) # True print(isinstance(lis2,Iterator)) # True

next():从迭代器中一个一个地取值

ret = iter([1, 2, 3])
print(next(ret))  # 1
print(next(ret))  # 2

基础数据类型:有一些未记录

float():用于将整数和字符串转换成浮点数

complex():用于创建一个值为 real + imag*j 的复数或者转化一个字符串或数为复数。如果第一个参数为字符串,则不需要指定第二个参数

print(complex(1, 2)) # (1+2j)
print(complex(1))    # (1+0j)
print(complex("1"))  # (1+0j)

 二进制(bin)、八进制(oct)、十六进制(hex)

print(bin(10), type(bin(10)))  # 0b1010 <class 'str'>
print(oct(10), type(oct(10)))  # 0o12 <class 'str'>
print(hex(10), type(hex(10)))  # 0xa <class 'str'>

abs():求绝对值

print(abs(-5))  # 5

divmod():除余

print(divmod(7,2)) --> 7除以2,得3余1
print(divmod(9,5)) --> 9除以5,得1余4
#(3, 1)
#(1, 4)

pow():幂运算

print(pow(2, 3))     # 幂运算,2的3次方
print(pow(2, 3, 3))  # 幂运算之后再取余数,即2*2*2/3余2
#8
#2

round():小数精确度

print(round(3.1415, 2))  # 3.14
print(round(3.1415, 3))  # 3.142  
print(round(3.1414, 3))  # 3.141

sum():对可迭代对象进行求和计算(可设置初始值)

print(sum([1, 2]))      # 3
print(sum((1, 2), 100)) # 103

min():返回可迭代对象的最小值(参数key为函数名,通过函数的规则,返回最小值)

max():返回可迭代对象的最大值(参数key为函数名,通过函数的规则,返回最大值)

print(min([1, 2, 3]))
print(min([-1, 4, 6], key=abs))  # key=abs 按绝对值比较大小,然后返回本来的值
# 1
# -1

list():将一个可迭代对象转化成列表(如果是字典,默认将key作为列表的元素)

print(list((1, 2, 3)))          # [1, 2, 3]
print(list({"k1": 1, "k2": 2})) # ['k2', 'k1']

tuple():将一个可迭代对象转化成元祖(如果是字典,默认将key作为元祖的元素)

print(tuple((1, 2, 3)))          # (1, 2, 3)
print(tuple({"k1": 1, "k2": 2})) # ('k1', 'k2')

reversed():返回反向迭代器

lis1 = [1, 2, 3, 4, 5]
lis2 = reversed(lis1)

print(lis2)  # <list_reverseiterator object at 0x0000000000B7B2B0>

for i in lis2:
    print(i)

slice():返回表示由指定的索引集的切片对象

l = (1,2,3,4,5,6,7)
s = slice(1, 5, 2)
print(l[s])     # (2, 4)
print(l[1:5:2]) # (2, 4)

format():将值转换为“格式化”表示

# 字符串可以提供的参数,指定对齐方式,<是左对齐, >是右对齐,^是居中对齐
print(format("xx", "<20"))
print(format("xx", ">20"))
print(format("xx", "^20"))

bytes():返回一个新的"bytes"对象

print(bytes("你好", encoding="GBK"))     # unicode转换成GBK的bytes
print(bytes("你好", encoding="utf-8"))   # unicode转换成utf-8的bytes

memoryview():返回从给定参数创建的"内存视图"对象

ret = memoryview(bytes("你好", encoding="utf-8"))
print(len(ret))                         # 6
print(bytes(ret[:3]))                   # b'\xe4\xbd\xa0'
print(bytes(ret[:3]).decode("utf-8"))   #

ord():字符按unicode转数字
chr():数字按unicode转字符

print(chr(48))   # 0
print(chr(49))   # 1

print(ord("A"))  # 65
print(ord("a"))  # 97

print(chr(65))   # A
print(chr(97))   # a

repr():返回包含对象的可打印表示的字符串

s = "xxx"
print("%r" % s)                     # 'xxx'
print(repr("1"), type(repr("1")))   # '1' <class 'str'>
print(repr(1), type(repr(1)))       # 1 <class 'str'>

frozenset():让集合变成不可变类型

s = frozenset("abcd")
print(s, type(s))  # frozenset({'c', 'a', 'd', 'b'}) <class 'frozenset'>

enumerate(iterable,start = 0):返回一个枚举对象(从start开始,默认为0)

lis = ["my", "name", "is", "pd"]
for i, item in enumerate(lis):
    print(i, item)
# 0 my
# 1 name
# 2 is
# 3 pd

for i, item in enumerate(lis, 1):
    print(i, item)
# 1 my
# 2 name
# 3 is
# 4 pd

all():可迭代对象中,有一个False就是False
any():可迭代对象中,有一个True就是True

print(all([0, 1])) # False
print(any([0, 1])) # True

zip():函数用于将可迭代的对象作为参数,将对象与对象之间对应的元素打包成一个元组。如果各个对象的元素个数不一致,则返回元祖的长度与最短的对象相同。

lis1 = [1, 2, 3]
lis2 = ["a", "b", "c"]
lis3 = {"k1": 11, "k2": 22}
for i in zip(lis1, lis2, lis3):
    print(i)
# (1, 'a', 'k1')
# (2, 'b', 'k2')

filter(function, iterable):过滤、返回一个迭代器

def func(x):
    return x % 2 == 1
ret = filter(func, [1, 2, 3, 4, 5, 6])  # 删除偶数,保留奇数
for i in ret:
    print(i)
# 相当于print([i for i in [1, 2, 3, 4, 5, 6] if i % 2 == 1])

# 利用filter()删除None和空字符串
def func(s):
    return s and len(s.strip()) > 0
ret = filter(func, ["a", None, "", "1"])
for i in ret:
    print(i)

# 求100以内的开平方
import math
def func(x):
    return math.sqrt(x) % 1 == 0
ret = filter(func, range(1, 101))
for i in ret:
    print(i)

map(function, iterable):返回一个迭代器

ret = map(abs, [1, -4, 6, -8])
for i in ret:
    print(i)
# 1
# 4
# 6
# 8

filter():执行了filter之后的结果集合  <=  执行之前的个数
     filter只管筛选,不会改变原来的值

map():执行前后元素个数不变,值可能发生改变

sorted(iterable, key=None,  reverse=False):临时排序,sort()为永久排序

# 参数key:传入一个函数名,函数的参数是可迭代类型中的每一项,根据函数的返回值大小排序
lis = [1, -3, 4, -6, 5, -2]
print(sorted(lis, key=abs, reverse=True))  # 取绝对值,再反向排序
print(lis)  # 证明sorted()为临时排序
# [-6, 5, 4, -3, -2, 1]
# [1, -3, 4, -6, 5, -2]

二、匿名函数

lambda:为了解决那些功能很简单的需求而设计的一句话函数

 格式:函数名 = lambda 参数:返回值

  • 参数可以有多个,用逗号隔开
  • 匿名函数不管逻辑多复杂,只能写一行,且逻辑执行结束后的内容就是返回值
  • 返回值和正常的函数一样可以是任意数据类型
def add(x, y):
    return x + y
print(add(1, 2))  # 3
# 换成匿名函数
add = lambda x, y: x + y
print(add(1, 2))  # 3
# 求字典中最大值对应的键
dic = {"k1": 10, "k2": 20, "k3": 30}
def func(k):
    return dic[k]
ret = max(dic, key=func)
print(ret)  # k3

# 换成匿名函数
print(max(dic, key=lambda k:dic[k]))  # k3

现有两个元组(("a"), ("b")),(("c"), ("d")),使用匿名函数生成列表[{"a": "c"}, {"b": "d"}]

ret1 = zip((("a"),("b")),(("c"),("d")))

def func(tup):
    return {tup[0],tup[1]}
ret2 = map(func, ret1)
print(list(ret2))  # [{'c', 'a'}, {'d', 'b'}]

ret3 = map(lambda tup:{tup[0]:tup[1]}, ret1)
print(list(ret3))  # []

 

posted @ 2018-09-06 22:32  就俗人一个  阅读(254)  评论(0编辑  收藏  举报