python22期第五天 内容总结 (内置函数)

课程大纲:

    1.函数的有效信息

    2.可迭代对象--迭代器

    3.生成器-列表生成器-生成器表达式

    4.列表推导式

    5.内置函数

 

一:函数的有效信息:

例子:

from functools import wraps

def logger(f):
    @wraps(f)
    def inner(*args, **kwargs):
        """
        :param args: 函数名,密码
        :param kwargs: 备用
        :return:  True
        """
        ret = f(*args, **kwargs)
        return ret
    return inner

@logger
def login(username,password):
    """
    此函数是完成登录功能的函数,需要用户名,和密码两个参数,返回True 登陆成功
    :return:  True
    """
    print(666)
    return True
# login(1,2)  #inner()
# # login('alex', 123)
print(login.__doc__)
print(login.__name__)

 

 

二:迭代对象:

可迭代对象类型:str, list tuple dict set range 文件句柄

 

判断可迭代对象:

该对象中,含有__iter__方法的就是可迭代对象,遵循可迭代协议。
print(dir(str))

 

第一种方法:
1,判断该对象是不是可迭代对象 '__iter__' in dir(对象)
print('__iter__' in dir(str))
print('__iter__' in dir(list))

 

2,判断该对象是不是可迭代对象  isinstance('abc',Iterable)

from collections import Iterable
# print(isinstance('abc',Iterable))
# print(isinstance('abc',str))

 

迭代器 内部含有__iter__ 且含有__next__方法的对象就是迭代器,遵循迭代器协议。

s1 = 'abc'
# obj_s = s1.__iter__() # 可迭代对象转化成迭代器
# obj_s = iter(s1) # 可迭代对象转化成迭代器
# print(obj_s) # <str_iterator object at 0x0000000001F4A128>
# print(obj_s.__next__())
# print(obj_s.__next__())
# print(obj_s.__next__())
# print(obj_s.__next__())

 

判断该对象是不是迭代器:

s1 = 'abc'
print('__iter__' in dir(s1))
print('__next__' in dir(s1))

 

判断该对象是不是可迭代器

from collections import Iterator
l1 = [1,2,3]
print(isinstance(l1,Iterator))
l1_obj = l1.__iter__()
print(isinstance(l1_obj,Iterator))

 

迭代器的好处
1,节省内存
2,惰性机制
3,单向执行,不可逆。

 

备注:迭代器走完最后一个会报错,需要try来捕捉报错,是的程序不反悔错误

例子:

s1 = 'fkdsafhdskfhsdklfjdslfksd'
s1_obj = s1.__iter__()
while True:
    try:
        print(s1_obj.__next__())
    except StopIteration:
        break

 

三:生成器:

概念:生成器本质就是迭代器,他是自定义的迭代器(自己用python代码写的迭代器)

例子1:函数方式构建一个生成器

def func1():
    print(111)
    yield 666
g_obj = func1()  # 生成器对象
# print(g_obj)  # <generator object func1 at 0x0000000001E21E60>
# 凡事函数中见到yield 他就是生成器
print(g_obj.__next__())

 

 

例子2:

def func1():
    # print(111)
    yield 666
    print(222)
    print(333)
    yield 'alex'
    print(888)
g_obj = func1()  # 生成器对象
#__next__() 和 yield 必须一一对应
print(g_obj.__next__())
print(g_obj.__next__())
print(g_obj.__next__())

 

 

例子3:

def cloth1():
    for i in range(1,5001):
        yield  '衣服%s' %i

g_obj = cloth1()  # 生成器对象

for i in range(50):
    print(g_obj.__next__())

for i in range(150):
    print(g_obj.__next__())

 

 

例子4:

def func1():
    count = yield 666
    print(count)
    yield 'alex'
    yield 'abc'
g_obj = func1()  # 生成器对象
print(g_obj.__next__())
print(g_obj.__next__())
send 和next 都是对生成器取值。
send 会给上一个yield 发送一个值。
send 不能用在第一次取值。
最后一个yield 不能得到值
print(g_obj.send('taibai'))
print(g_obj.send('taibai'))
print(g_obj.__next__())

 

 

四:列表推导式:

讲一个简单的否循环写成列表推导式:

例子1:

l1 = []
for i in range(1,23):
    l1.append('python%s期' % i)
print(l1)

l = [i for i in range(1,11)]
# [变量(加工后的变量) for 变量 in iterable] 遍历模式
# print(l)
l2 = ['python%s期' % i for i in range(1,23)]
print(l2)

[变量(加工后的变量) for 变量 in iterable] 遍历模式

 

 

例子2:

[变量(加工后的变量) for 变量 in iterable] 遍历模式
[变量(加工后的变量) for 变量 in iterable if 条件] 筛选模式

l2 = [i for i in range(1,31) if i % 3 == 0]
print(l2)
l2_obj = (i for i in range(1,31) if i % 3 == 0)
print(l2_obj)
for i in l2_obj:
    print(i)
print(l2)

 

 

列表推导式的特点:

列表推导式:简单,一行搞定。
特别复杂的数据列表推导式无法实现,只能用其他方式实现。
列表推导式不能排错。


列表推导式与生成器表达式区别

1 ,列推直观能看出,但是占内存
2,生成器表达式不易看出,但是节省内存。

 

 

五:内置函数:

1.作用域相关:

locals golbals
1.2其他相关
1.2.1 ***eval exec
print(eval('1 + 2 +3'))
print(eval("{'name':'alex'}"),type(eval("{'name':'alex'}")))
exec:执行字符串类型的代码。
print(exec('1 +2 +3'))

s1 = '''
for i in range(5):
    print(i)
'''
print(exec(s1))

 

 

 

1.2:compile:将字符串类型的代码编译。代码对象能够通过exec语句来执行或者eval()进行求值。

1.2.2 输入输出相关 ***input,print
print(1, 2, 3, sep='****') # 分隔符
print(1111,end='')  # 换行
print(222)
with open('练习',encoding='utf-8', mode='w') as f1:
    print('今天天气还可以',file=f1)

 

 

1.3 :*hash:获取一个对象(可哈希对象:int,str,Bool,tuple)的哈希值。

# print(hash('alex'))
# print(hash('alex1'))
# print(hash((1,2,3)))
# print(hash(10))
# print(hash(99))
# print(hash(True))

 

 

1.4:** 调用相关:** callable:函数用于检查一个对象是否是可调用的。如果返回True,object仍然可能调用失败;但如果返回False,调用对象ojbect绝对不会成功。

name = 'alex'
def func1():
    print(111)
print(callable(name))
print(callable(func1))

 

 

1.5 :基础数据类型相关

数字相关:

数据类型(4):
    bool :用于将给定参数转换为布尔类型,如果没有参数,返回 False。
    int:函数用于将一个字符串或数字转换为整型。
**int:函数用于将一个字符串或数字转换为整型。
print(int())  # 0

print(int('12'))  # 12

print(int(3.6))  # 3

*float:函数用于将整数和字符串转换成浮点数。
i = 2.456
print(i,type(i))
print(float(1.1))

 

 

1.6 进制转换:

进制转换(3):*

    bin:将十进制转换成二进制并返回。

    oct:将十进制转化成八进制字符串并返回。

    hex:将十进制转化成十六进制字符串并返回。
print(bin(19))
print(oct(9))
print(hex(15))

 

 

1.7 数学运算:

# bs:函数返回数字的绝对值。
# print(abs(-1.2))
#  *** divmod:计算除数与被除数的结果,
# 返回一个包含商和余数的元组(a // b, a % b)。
# print(divmod(100,7))  #  (商,余数)
# *round:保留浮点数的小数位数,默认保留整数。
# print(round(3.43543656,4))
# *pow:求x**y次幂。(三个参数为x**y的结果对z取余)
# print(pow(2,3))
# print(pow(2, 3, 3))

# *** sum:对可迭代对象进行求和计算(可设置初始值)。
l1 = [i for i in range(100)]
# print(sum(l1))
# print(sum(l1,100))

l2 = [2, 5, 6, -7]
# ***min:返回可迭代对象的最小值(可加key,key为函数名,
# 通过函数的规则,返回最小值)。
# print(min(l2))
# print(min(l2,key=abs))
# *** max:返回可迭代对象的最大值(可加key,key为函数名,通过函数的规则,返回最大值)。
# print(max(l2,key=abs))
# reversed:将一个序列翻转,并返回此翻转序列的迭代器。
l3 = [2, 3, 9, 8, 7, 4]
# l3.reverse()
# print(l3)
# l_obj = reversed(l3)
# # print(l_obj)
# for i in l_obj:
#     print(i)

 

 

1.8 * slice:构造一个切片对象,用于列表的切片。

l3 = [2, 3, 9, 8, 7, 4]
rule = slice(0,3)
print(l3[rule])

 

 

1.9 * format 科学计算

print(format('test', '<30'))
print(format('test', '>20'))
print(format('test', '^20'))

 

 

1.10:bytes 将unicode 转化成bytes

s = 'alex'
b1 = s.encode('utf-8')
print(b1)
print(bytes(s, encoding='utf-8'))

 

 

1.11:***map:会根据提供的函数对指定序列做映射。返回的是迭代器

def square(x):
    return x ** 2
print(map(square, [1,2,3,4,5]) )
for i in map(square, [1,2,3,4,5]):
    print(i)

print((i**2 for i in [1,2,3,4,5]))

 

 

1.12 :sorted:对所有可迭代的对象进行排序操作。

ll = sorted(l3)
print(ll)
sorted()
def func(x): return x[1]
L = [('a', 3), ('d', 4), ('b', 2), ('c', 1), ]
print(sorted(L, key=func))

 

 

1.13:*** enumerate:枚举,返回一个枚举对象。

l1 = ['alex', 'laonanhai', 'taibai']
for index,content in enumerate(l1):
    print(index,content)
for index,content in enumerate(l1,10):
    print(index,content)

 

 

1.14:map:会根据提供的函数对指定序列做映射。返回的是迭代器

def square(x):
    return x ** 2
print(map(square, [1,2,3,4,5]) )
for i in map(square, [1,2,3,4,5]):
    print(i)

print((i**2 for i in [1,2,3,4,5]))

 

 

1.15:匿名函数:

def func(x,y): return x + y
print(func(3,4))
func1 = lambda x,y: x + y
print(func1(3,4))

def func1(x): return x**2
res = map(lambda x: x**2,[1,5,7,4,8])
for i in res:
    print(i)

 

posted @ 2018-06-07 11:16  MR_dy  阅读(97)  评论(0)    收藏  举报