python基础部分(三)

一、第一类对象

函数对象可以像变量一样进行赋值,也可以当列表中的元素。

def func1():
    print("秦始皇")
def func2():
    print("乌尔天")
def func3():
    print("曹操")
def func4():
    print("刘备")
lst=[func1,func2,func3,func4]
for el in lst:
    el()

程序输出结果为:

秦始皇
乌尔天
曹操
刘备

另一种方案

def func1():
    print("秦始皇")
def func2():
    print("乌尔天")
def func3():
    print("曹操")
def func4():
    print("刘备")
lst=[func1(),func2(),func3(),func4()]
print(lst)

程序输出结果为:

秦始皇
乌尔天
曹操
刘备
[None, None, None, None]

例四

def func2():
    print("哈哈")
def func3():
    print("呵呵")
def proxy(a): #代理,装饰器的实现
    a()
proxy(func2)
proxy(func3)

程序输出结果为:

哈哈
呵呵

二、闭包

在内层函数访问时,调用外部一层的局部变量。

def wrapper():
    name="周杰伦"
    def inner():
        print(name)
    return inner
ret =wrapper()
ret()

在调用inner时访问了name

周杰伦

全局变量时是不安全的一种访问方式。
比如在函数内部写局部变量。
闭包的优点:
1、可以保护变量不被其他人修改
2、变量常驻内存(可用于爬虫)
怎么查看是否是闭包?

def wrapper():
    name="周杰伦"
    def inner():
        print(name)
    print(inner.__closure__)
    inner()
wrapper()

能打印出来东西就是闭包

(<cell at 0x000001C4AA467648: str object at 0x000001C4AA5014B0>,)
周杰伦

三、迭代器

'int' object is not iterable

dir()可以帮我们查看数据能够执行的操作。
所有有__iter__就能用for循环,

print(dir(range))

程序输出结果为:

['__bool__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index', 'start', 'step', 'stop']

例二、

lst=["das","fgwe","tiojrth"]
it =lst.__iter__()
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())

程序输出结果为:

das
Traceback (most recent call last):
fgwe
  File "F:/lei/lei/test.py", line 184, in <module>
    print(it.__next__())
StopIteration 
tiojrth

注:只能向下执行,不能反复
结束的时候会给我们扔出一个错误 StopIteration
整合所有的数据类型进行遍历
for 循环流程模拟代码

lst=["das","fgwe","tiojrth"] 
it =lst.__iter__() #获取迭代器
while 1: #循环
    try: #尝试
     el = it.__next__() #拿数据
     print(el) #打印数据
    except StopIteration: #出了错误,意味着数据拿完了
        break #结束循环
	官方通过代码判断是否是迭代器
	借助于两个模块,Iterator迭代器,Iterable可迭代的
    	from collections import Iterable,Iterator
lst=[1,2,3]
print(isinstance(lst,Iterable))
print(isinstance(lst,Iterator)) #列表不是迭代器,返回False

程序输出结果为:

  True
False 

迭代器一定可迭代,可迭代的不一定是迭代器。
作用:统一了各种数据类型的遍历。
函数的注释,一般在函数内部

def func(name,age):
	'''
	函数的功能
	'''
	print("哈哈")
a = func
print("嘿嘿")
print(a.__name__) #查看函数的真实的名字
print(a.__doc__)  #查看函数的说明文档

程序输出结果为:

嘿嘿
func

	函数的功能

四、生成器表达式和各种推导式

1、生成器
本质就是迭代器
一个一个的创建对象
创建生成器的方法:
1、生成器函数
2、通过生成器表达式来获取生成器
3、类型转换
2、生成器函数
引入:

def func():
    print("哈哈")
    return "你好啊"
ret = func() #定义函数变量
print("返回值是:",ret) #调用函数,接收函数的返回值

程序输出结果为:

哈哈
返回值是: 你好啊

改变:

 #函数中包含yield,此函数就是生成器函数
  #生成器函数运行之后,产生一个生成器,而不是运行函数。
    def func():
        print("哈哈")
        yield "你好啊" #yield表示返回,并不会终止函数的执行。
        print("嘿嘿")
        yield "到下一步了"
    ret = func() #执行函数,并没有运行函数
    #此时我们拿的是生成器
    print(ret.__next__())
    print(ret.__next__())

程序输出结果为

哈哈
你好啊
嘿嘿
到下一步了

用生成器会节省内存空间,买衣服的例子

def buy():
    for i in range(1,10000):
        yield "衣服%s"%i
ret = buy()
num = int(input("请输入你要买的衣服数量:"))
for j in range(num):
    print(ret.__next__())

程序输出结果为:

请输入你要买的衣服数量:50
衣服1
衣服2
衣服3
衣服4
衣服5
衣服6
衣服7
衣服8
衣服9
衣服10
衣服11
衣服12
衣服13
衣服14
衣服15
衣服16
衣服17
衣服18
衣服19
衣服20
衣服21
衣服22
衣服23
衣服24
衣服25
衣服26
衣服27
衣服28
衣服29
衣服30
衣服31
衣服32
衣服33
衣服34
衣服35
衣服36
衣服37
衣服38
衣服39
衣服40
衣服41
衣服42
衣服43
衣服44
衣服45
衣服46
衣服47
衣服48
衣服49
衣服50

需要一大波数据,但不是一次都要拿来用,可以考虑生成器。
#send() 等同于 next
#但可以给上一个yield位置传值

def func():
    print("面包")
    a = yield "沙拉味"
    print("a",a)
    b = yield "香辣味"
    print("b", b)
ret = func()
print(ret.__next__())
print(ret.__next__())

没有用send之前,a,b都得不到值

面包
沙拉味
a None
香辣味

返回None
当使用send(“值”)之后,可以进行给a传值

def func():
    print("面包")
    a = yield "沙拉味"
    print("a",a)
    b = yield "香辣味"
    print("b", b)
    c = yield "老坛酸菜味"
    print("c", c)
ret = func()
print(ret.__next__())#第一个next没必要传值
print(ret.send("篮球"))
print(ret.send("足球"))

当使用send()进行传值时,a,b都得到了相应的值

面包
沙拉味
a 篮球
香辣味
b 足球
老坛酸菜味

注:return会立即终止函数的执行
而yield会继续执行函数
生成器函数运行之后返回生成器,不会直接执行函数。
能向下执行的两个条件:
next(),执行到下一个yield
send()执行到下一个yield,给上一个yield传值。
3、各种推导式
①、列表推导式[结果 for循环 if 条件]
for循环列表的推导式

lst=["python%s期"% i for i in range(1,19)]
print(lst)

②、字典推导式{ 结果(key:value) for 循环 if条件}

lst=[11,22,33]
dic={ i:lst[i] for i in range(len(lst))}
print(dic)

程序输出结果为:

{0: 11, 1: 22, 2: 33}

③、集合推导式{k for循环 if 条件}
注:没有元组推导式
生成器表达式:
(结果 for循环 if)
补充:

def func():#生成器函数
    print(11111)
    yield 22222
g=func() #创建生成器
g1=(i for i in g ) #生成器表达式
g2=(i for i in g1 )  #生成器表达式
print(list(g)) #拿到func()中数据
print(list(g1))  #拿不到g中的数据,返回空
print(list(g2)) #拿不到g1中的数据,返回空

五、内置函数

1、匿名函数 lambda

def func(a,b):
    return a+b
print(func(3,4))

等价于

fn=lambda a,b :a+b
print(fn(3,4))

用匿名函数构造简单函数。
2、sorted(iterable ,key=function排序规则,reverse=反转) 排序函数

lst=["魔鬼","天使","的撒大个","怎么了"]
#按照字符串长度排序
def func(s):
    return len(s)
m = sorted(lst,key=func)
print(m)

例二

lst=[
    {"name":"haha","age":25,"tizhong":150},
    {"name":"hehe","age":20,"tizhong":130},
    {"name":"nihao","age":15,"tizhong":170},
    {"name":"enen","age":35,"tizhong":180},
    {"name":"xixi","age":45,"tizhong":160},
]#按照年龄排序
print(sorted(lst,key=lambda dic:dic["age"],reverse= True))#倒序

程序输出结果为:

[{'name': 'xixi', 'age': 45, 'tizhong': 160}, {'name': 'enen', 'age': 35, 'tizhong': 180},
 {'name': 'haha', 'age': 25, 'tizhong': 150}, {'name': 'hehe', 'age': 20, 'tizhong': 130},
  {'name': 'nihao', 'age': 15, 'tizhong': 170}]

3、filter(function,iterable) 过滤
#过滤掉姓张的人

 lst=["玄墨","方冰冰","张翠山","胡一菲"]
    f = filter(lambda name : not name.startswitch("张"), lst)
    for item in f:
        print(item)

4、文件操作相关(exec,eval,compile)
让用户输入代码:

code=input("请输入要执行的代码")
exec(code)

程序执行结果为:

请输入要执行的代码print(31232)
31232

5、reversed翻转,但返回的是迭代器。

 lst=[1,34,5632,65,63,2]
r = reversed(lst)
print(list(r))

程序输出结果为:

[2, 63, 65, 5632, 34, 1]

6、slice切片

lst=[1,34,5632,65,63,2]
s = slice(2,4)
print(lst[s])

程序输出结果为:

[5632, 65]

7、字符串相关内置函数
①str
②format
之前学过的format

  s = "我叫{0},我来自{1},喜欢{2}".format("周杰伦","台湾","唱歌")
    print(s)

程序输出结果为:

我叫周杰伦,我来自台湾,喜欢唱歌

这里的format()具体输出排版

s = "我叫{0},我来自{1},喜欢{2}".format("周杰伦","台湾","唱歌")
print(format(s,"<20"))
print(format(s,">20"))
print(format(s,"^20"))#居中

程序输出结果为:

我叫周杰伦,我来自台湾,喜欢唱歌    
    我叫周杰伦,我来自台湾,喜欢唱歌
  我叫周杰伦,我来自台湾,喜欢唱歌  

2、format()可以实现进制的转化

print(format(11,"b")) #二进制
print(format(11,"c"))#转化成unicode字符
print(format(11,"d"))#十进制
print(format(11,"o"))#八进制
print(format(11,"x"))  #六进制
print(format(11,"X"))  #六进制
print(format(11,"n"))
print(format(11,"#"))

程序输出结果为:

 1011

11
13
b
B
11
11

3、科学记数法

print(format(123456789,"e"))#科学记数法,默认保留6位小数,表示大的数据。
print(format(123456789,"0.2e")) #科学记数法,默认保留2位小数,表示大的数据。
print(format(123456789,"0.2E"))
print(format(1.23456789,"f"))#浮点记数法,保留6位
print(format(1.23456789,"0.2f"))#浮点记数法,保留2位
print(format(1.23456789,"0.10f"))#浮点记数法,保留10位
print(format(1.23456789e+10000,"F"))

程序输出结果为:

1.234568e+08
1.23e+08
1.23E+08
1.234568
1.23
1.2345678900
INF

注:INF 无限(无穷大)
4、ord(编码位置)

print(ord("中"))

程序输出结果为:

20013

5、chr()给出编码的内容,返回字

print(chr(20014))

程序输出结果为:

6、ascii()转化成unicode显示效果

print(ascii("中"))

程序输出结果为:

'\u4e2d'

7、转义字符
\n 换行
\t tab制表符
\r 回车
" 双引号
\ '单引号
\ \

print("你好,我是\大司马") # cpython没事,拿到c语言里,报错

python交给解释器之前,给repr()处理,还原字符串最官方的效果。

print(repr("你好,我是\大司马")) 

程序输出结果为:

'你好,我是\\大司马'

在引号外加r,里面不转义,原样输出。

print((r"你好\n,我\t是\大司马"))

程序输出结果为:

你好\n,我\t是\大司马
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值