推导式:

推导式是一个或者多个迭代器快速简洁的创建数据结构的一种方法。
它可以将循环和条件判断结合,从而避免语法冗长的代码。
悄悄告诉你,会使用推导式。很大程度上说明,你已经超过许多初学者啦·
也就是说,使用推导式更加像python的风格·

列表推导式:

一个一个追加。

Python外壳:代码结构!(推导式和函数 )_python


也可以使用,上面说过的range()函数

Python外壳:代码结构!(推导式和函数 )_python_02

但是,更加像python风格的操作:

利用推导式。

Python外壳:代码结构!(推导式和函数 )_python_03


第一个是输入列表的值,第二个是循环变量·

下面再举一个例子试试:

Python外壳:代码结构!(推导式和函数 )_python_04


明显嘛·就是输入其中的值·

还可以添加一个条件筛选(有难度喽·)

一个筛选出来偶数,一个筛选出来奇数。

Python外壳:代码结构!(推导式和函数 )_生成器_05

这个远比老方法,简单。而且比较秀·

Python外壳:代码结构!(推导式和函数 )_python_06


这个就显得很冗长啦。下面来探索一下两元素的输出。

老办法:

Python外壳:代码结构!(推导式和函数 )_Python外壳:代码结构!_07


利用推导式:

Python外壳:代码结构!(推导式和函数 )_命名空间_08


(还是要实战去练习的呀·)

Python外壳:代码结构!(推导式和函数 )_生成器_09


不带小括号的就让它输出来两个元素就好啦·字典推导式:

当然字典推导式也可以有if判断语句以及for循环语句

Python外壳:代码结构!(推导式和函数 )_生成器_10

哈哈,是不是有点懵呀。其实我也不太懂。那就化困难为简单。来看看简单的表达意思是啥·

w.count('a'):是统计某个字符在单词里面出现的次数~
for z in w:是让单词里面的所有字符都输出一遍~

Python外壳:代码结构!(推导式和函数 )_Python外壳:代码结构!_11


这么看来就是:一个推导式的功能等于那两个程序加在一起的功能喽·

n = {z:w.count(z) for z in w}

神奇
但是,也有优化可以做。因为某些字符出现不止是一次,
但是因为那个.count()函数,对每一个字符一次就可以统计其出现次数和。
所以没必要多次进行计算·
我们借助集合来:

第一次n和第二次n内容没变,但是次序却发生变换啦
set(w)其中的字符没有重复出现过·
可以~

Python外壳:代码结构!(推导式和函数 )_命名空间_12


集合推导式:

这个可以参照之前的东西,都是很相近的~

这里就说一个比较简单的。range()范围:

Python外壳:代码结构!(推导式和函数 )_命名空间_13

Python外壳:代码结构!(推导式和函数 )_Python外壳:代码结构!_14


生成器推导式:

元组没有推导式,就是那种带圆括号的。

其实,他们是生成器推导式,返回的是一个生成器对象~

Python外壳:代码结构!(推导式和函数 )_python_15


但是只能调用一次,列表,集合,字符串,字典都存储在内存里面。
生成器仅仅在运行的时候会产生数值。不能被备份为一个新的生成器,或者是第二次使用。
函数:

def 函数名 带有函数参数的圆括号:

虽然上面的你早就知道啦。跟C一样的命名规则。

Python外壳:代码结构!(推导式和函数 )_生成器_16


if-elif-else:叫做逻辑链·

Python外壳:代码结构!(推导式和函数 )_Python外壳:代码结构!_17


调用:

Python外壳:代码结构!(推导式和函数 )_Python外壳:代码结构!_18

位置参数:

(括号别搞错了·)

Python外壳:代码结构!(推导式和函数 )_Python外壳:代码结构!_19

最后:

Python外壳:代码结构!(推导式和函数 )_python_20


但是我这个没有出现书上的顺序错乱。

所以,也就不好引出关键字参数啦。

那就直接来,就是指定了参数!不会出现顺序紊乱·

Python外壳:代码结构!(推导式和函数 )_生成器_21


指定默认参数值:

Python外壳:代码结构!(推导式和函数 )_python_22


注意,参数是“=”符号。

不输入的话,默认会是c自己。但是一旦输入参数值的话,就会发生顶替。仅使用一次的空列表:

Python外壳:代码结构!(推导式和函数 )_python_23


但是,有也可以反过来用啊。利用列表来存储好多东西。哈哈·

使用*收集位置参数:

将不固定数量的参数,变成元组传进去!

Python里面没有指针一说

(这个用着挺好的)

Python外壳:代码结构!(推导式和函数 )_生成器_24


这样做的好处,是你可以确定几个输出。其他的都可以来进行追加!

Python外壳:代码结构!(推导式和函数 )_(推导式和函数 )_25


但是,不能进行空白输出!图中用红色线圈起来的。两个**符号的,将不固定数量的参数,变成字典传进去!

会出现键值对!

{}:代表字典·

Python外壳:代码结构!(推导式和函数 )_Python外壳:代码结构!_26


a='b’的格式!

Python外壳:代码结构!(推导式和函数 )_生成器_27

文档字符串:

(但是那个_doc_的我失败啦!)

Python外壳:代码结构!(推导式和函数 )_生成器_28


一等公民:函数

Python里面的一切都是对象,包括数字,字符串,元组,列表,字典,函数。
不过,函数可以将返回值赋值给变量,可以作为参数被其他函数调用。
也可以从其他函数里面返回值!

Python外壳:代码结构!(推导式和函数 )_python_29

跟C语言里面的()一样,代表调函数的意思!

Python外壳:代码结构!(推导式和函数 )_命名空间_30


就是调用函数啦!

Python外壳:代码结构!(推导式和函数 )_命名空间_31


Python外壳:代码结构!(推导式和函数 )_python_32


rr:里面的参数,第一个是可以调用的函数,另外两个是参与运算的参数。

ff(x,y)

是这个函数执行的操作!

老朋友:
*a(位置参数收集) 元组
**a(关键字参数收集) 字典

sum()是Python自定义的函数。可以进行求和。

内部函数:

Python外壳:代码结构!(推导式和函数 )_Python外壳:代码结构!_33


再来一个例子:

return "the name is '%s'" % qq#新知识呦~

Python外壳:代码结构!(推导式和函数 )_生成器_34


闭包:

内部函数可以看作为一个闭包。
闭包是一个可以由另一个函数动态生成的函数,并且可以改变和存储函数外创建的变量的值。

闭包就是能够读取其他函数内部变量的函数。
例如在javascript中,只有函数内部的子函数才能读取局部变量,
所以闭包可以理解成“定义在一个函数内部的函数“。
在本质上,闭包是将函数内部和函数外部连接起来的桥梁。

Python外壳:代码结构!(推导式和函数 )_生成器_35


只是进行复制,并没有进行调用。看类型。

只有a(),这个调用函数才可以输出正确结果!

因为返回的是一个函数名字。看作复制就好啦~

​匿名函数​

生成器:

生成器是用来创建Python里面序列的。可以通过它迭代庞大的序列。

但是是通过yield来进行返回值声明

但是调用一次就会进行释放:

(比如下面的例子):

Python外壳:代码结构!(推导式和函数 )_生成器_36

装饰器:

是对函数进行再次改变,不改变源代码就可以实现!

感觉很重要的样子,嘻嘻

装饰器本质上就是一个函数,将一个函数作为输入。并且返回另外一个函数。

*a,**b利用这两个知识进行做装饰器。

Python外壳:代码结构!(推导式和函数 )_python_37


是不是有点晕,哎呀。看不懂操作·

感觉有点像C里面的函数调用。

Python外壳:代码结构!(推导式和函数 )_(推导式和函数 )_38


这个就是对前面那个:cc = tt(add)

代码的代替。

一个函数可以有多个装饰器。

Python外壳:代码结构!(推导式和函数 )_Python外壳:代码结构!_39

Python外壳:代码结构!(推导式和函数 )_命名空间_40

调用顺序不同,最后得到的结果也会不同的。

靠近def的修饰器先执行,但是所返回的数值。也会被后面执行的所替换掉!

Python外壳:代码结构!(推导式和函数 )_生成器_41


二者就是数值结果不同,别的都是一样的。得到的值取决于第一个被调用的修饰器!命名空间和作用域:

一个名称在不同使用情况下,可能代指不同的事物。每一个命名空间和别的命名空间没有关系。

但是,同样也可以调用别的。

就像以前我写爬虫用的全局:global

Python外壳:代码结构!(推导式和函数 )_命名空间_42


不使用global就会出错误!

关于变量的ID号的!

全局和函数局部是不一样的!

Python外壳:代码结构!(推导式和函数 )_生成器_43


local():返回一个局部命名空间内容的字典

global():返回一个全局命名空间内容的字典

(看不清就点开看!)

Python外壳:代码结构!(推导式和函数 )_命名空间_44


就说说:名称里面的_和__。这些都是Python的保留用法。自变量定义的时候不可以使用这些。


用try和except处理错误:

就是缩短你找错误的时间啦。

写这个用的时间多,将来排查错误用的时间就少啦!

Python外壳:代码结构!(推导式和函数 )_Python外壳:代码结构!_45


当然,也可以更加精确一点!

>>> while True:
... vv = input('q to quit!')
... if vv == 'q':
... break
... try:
... pp = int(vv)
... print(s[pp])
... except IndexError as err:#那个是保留字!标准库提前定义好的!
... print('index error.',pp)
... except Exception as other:
... print('something else error.',other)
...
q to quit!1
2
q to quit!0
1
q to quit!2
3
q to quit!3
index error. 3
q to quit!6
index error. 6
q to quit!7
index error. 7
q to quit!8
index error. 8
q to quit!tt
something else error. invalid literal for int() with base 10: 'tt'
q to quit!

Python外壳:代码结构!(推导式和函数 )_生成器_46


好用!