Python基础-迭代器&生成器&装饰器

$request->cookie(‘name’);

列表生成式

我今天产生个要求,看列表[0, 1, 2, 3, 4, 5, 6, 7, 8,
9],我求您将列表里之每个值加1,你怎么落实?你也许会见想到2种植方式 

 

>>> a

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> b = []

>>> for i in a:b.append(i+1)

>>> b

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

>>> a = b

>>> a

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

 

a = [1,3,4,6,7,7,8,9,11]

for index,i in enumerate(a):
    a[index] +=1
print(a)

原值修改

 

 文艺青年版

>>> a

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

>>> a = map(lambda x:x+1, a)

>>> a

<map object at 0x101d2c630>

>>> for i in a:print(i)

3

5

7

9

11

 

实质上还有雷同种植写法,如下 

 装逼青年版

>>> a = [i+1 for i in range(10)]

>>> a

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

 

随即就是受做列表生成

 

(a).占位符 @yield(‘title’)

本节情

});
7.404页面设置
resources/views/errors/404.blade.php
8.CSRF保护
POST 提交 自动执行 csrf

小结

是可图被for循环的靶子都是Iterable类型;

举凡可图被next()函数的目标都是Iterator类型,它们表示一个惰性计算的序列;

会合数据类型如list、dict、str等是Iterable但切莫是Iterator,不过可以通过iter()函数获得一个Iterator对象。

Python的for循环本质上就经持续调用next()函数实现之,例如:

1

2

for x in [1, 2, 3, 4, 5]:

    pass

骨子里完全等价于:

 

# 首先得Iterator对象:

it = iter([1, 2, 3, 4, 5])

# 循环:

while True:

    try:

        # 获得下一个价值:

        x = next(it)

    except StopIteration:

        # 遇到StopIteration就退循环

        break

 

 

  

以laravel中 php端一律采取相对路径 html端 一律使用绝对路径
echo “<img src=’/1.jpg’>”;
include “”; 相对路径

  1. 迭代器&生成器
  2. 装饰器
  3. Json & pickle 数据序列化
  4. 软件目录结构正式
  5. 作业:ATM项目开发

return response(”)->withCookie(‘cookie名’,’cookie值’,过期日子);

 

******************************
2.提取请求参数 POST GET
①.提取参数 $request->input(‘name’);
②.设置默认值 $request->input(‘name’,’xy’);
③.检测是否是 $request->has(‘name’);
④.提取所有参数 $arr=$request->all();
⑤.提取部分 $arr=$request->only([‘username’,’password’]);
⑥.提取部分 $arr=$request->except([‘username’,’password’]);

有关配置文件的下办法

瞩目,在上面的目录结构中,没有将conf.py放在源码目录下,而是放在docs/目录下。

不少档对配备文件的施用做法是:

  1. 布文件写在一个或者多单python文件中,比如此处的conf.py。
  2. 类型蒙谁模块用到是布局文件就直接通过import
    conf这种样式来以代码中行使安排。

这种做法我不太支持:

  1. 即时让单元测试变得紧巴巴(因为模块内部依赖了外部配置)
  2. 一面配置文件作为用户控制次的接口,应当可以由用户自由指定该公文之路子。
  3. 次组件可复用性太差,因为这种贯穿所有模块的代码硬编码方式,使得大部分模块都依赖conf.py这个文件。

为此,我道配置的动,更好之主意是,

  1. 模块的安排都是足以活配置的,不受外部配置文件之震慑。
  2. 次第的布置为是可活决定的。

能佐证是思想之是,用了nginx和mysql的同室还知,nginx、mysql这些程序都可轻易之指定用户配置。

因而,不应有于代码中一直import
conf来运安排文件。上面目录结构被的conf.py,是吃有之一个布局样例,不是当写深在先后中一直引用的配置文件。可以通过吃main.py启动参数指定安排路径的措施来叫程序读取配置内容。当然,这里的conf.py你得变个像样之名,比如settings.py。或者你吧足以以其他格式的情节来编排配置文件,比如settings.yaml之类的。

 

落闪存的参数 old(‘参数’)

login(america)不触发而函数的实行,只需要在这个login里面再定义一叠函数,第一不良调用america

login(america)只调用到外围login,这个login虽然会执行,但非见面沾认证了,因为证实的具备代码被封闭装在login里层的新定义
的函数里了,login只回 里层函数的函数叫作,这样下次又执行america()时,
就会见调用里层函数啦。。。

汝:。。。。。。什么? 什么独意思,我蒙逼了。。。

老王:还是于您看代码吧。。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

def login(func): #把要执行的模块从这里传进来

 

    def inner():#再定义一层函数

        _username = "alex" #假装这是DB里存的用户信息

        _password = "abc!23" #假装这是DB里存的用户信息

        global user_status

 

        if user_status == False:

            username = input("user:")

            password = input("pasword:")

 

            if username == _username and password == _password:

                print("welcome login….")

                user_status = True

            else:

                print("wrong username or password!")

 

        if user_status == True:

            func() # 看这里看这里,只要验证通过了,就调用相应功能

 

    return inner #用户调用login时,只会返回inner的内存地址,下次再调用时上()才会执行inner函数

此刻若细心着了老王写的代码 ,感觉老王真不是形似人呀,连这种奇淫巧技都能想出去。。。,心中暗自感谢及天赐你一个大牛邻居。

乃: 老王呀,你这个姿势非常nb呀,你独创的?

这会儿而媳妇噗嗤的欢笑有声来,你吗无晓得 她乐个圆球。。。

老王:呵呵, 这不是本身独创的呀当然
,这是出中一个常用的玩法,叫语法糖,官方名称“装饰器”,其实上面的写法,还足以另行简短

得拿下部代码去丢

1

america = login(america) #你在这里相当于把america这个函数替换了

独自在您如果装修的函数方面长下面代码

1

2

3

4

5

6

7

8

9

10

11

12

@login

def america():

    #login() #执行前加上验证

    print("—-欧美专区—-")

 

def japan():

    print("—-日韩专区—-")

 

@login

def henan():

    #login() #执行前加上验证

    print("—-河南专区—-")

功能是如出一辙的。

乃开玩笑的戏着老王教您的初姿势 ,玩在打在就手贱给您的“河南专区”版块
加了单参数,然后,结果 出错了。。。

 图片 1

而:老王,老王,怎么传个参数就很了吗?

老王:那得呀,你调用henan时,其实是一定给调用的login,你的henan第一潮调用时henan
= login(henan),
login就回去了inner的内存地址,第2不良用户自己调用henan(“3p”),实际上相当给调用的时inner,但你的inner定义时并无设置参数,但您被他染了个参数,所以本来就是报错了呀

您:但是自己的 版块要传参数呀,你莫给自家传好呀。。。

老王:没说不让你传,稍做更改便只是。。

 图片 2

老王:你又试试就吓了 。 

你: 果然好要,大神就是大神呀。 。。 不过,如果有差不多只参数为?

老王:。。。。老弟,你绝不啊都吃自己教你吧,非固定参数你无学过么?
*args,**kwargs…

君:噢 。。。还能如此折腾?,nb,我再次试试。

 

依开放-封闭原则,最终代码如下 。

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

51

52

53

54

55

56

#_*_coding:utf-8_*_

 

 

user_status = False #用户登录了就把这个改成True

 

def login(func): #把要执行的模块从这里传进来

 

    def inner(*args,**kwargs):#再定义一层函数

        _username = "alex" #假装这是DB里存的用户信息

        _password = "abc!23" #假装这是DB里存的用户信息

        global user_status

 

        if user_status == False:

            username = input("user:")

            password = input("pasword:")

 

            if username == _username and password == _password:

                print("welcome login….")

                user_status = True

            else:

                print("wrong username or password!")

 

        if user_status == True:

            func(*args,**kwargs) # 看这里看这里,只要验证通过了,就调用相应功能

 

    return inner #用户调用login时,只会返回inner的内存地址,下次再调用时加上()才会执行inner函数

 

 

def home():

    print("—首页—-")

 

@login

def america():

    #login() #执行前加上验证

    print("—-欧美专区—-")

 

def japan():

    print("—-日韩专区—-")

 

# @login

def henan(style):

    ”’

    :param style: 喜欢看什么类型的,就传进来

    :return:

    ”’

    #login() #执行前加上验证

    print("—-河南专区—-")

 

home()

# america = login(america) #你在这里相当于把america这个函数替换了

henan = login(henan)

 

# #那用户调用时依然写

america()

 

henan("3p")

 

 第二2天早上,产品经理又提了新的需,要允许用户选择用qq\weibo\weixin认证,此时的君,已深谙装饰器各种装逼技巧,轻松的即使实现了新的求。

 

 

#_*_coding:utf-8_*_

 

 

user_status = False #用户登录了便管这改变成为True

 

def login(auth_type): #拿要尽之模块于这里传进

    def auth(func):

        def inner(*args,**kwargs):#又定义一重叠函数

            if auth_type == “qq”:

                _username = “alex” #作这是DB里存的用户信息

                _password = “abc!23” #弄虚作假这是DB里存的用户信息

                global user_status

 

                if user_status == False:

                    username = input(“user:”)

                    password = input(“pasword:”)

 

                    if username == _username and password ==
_password:

                        print(“welcome login….”)

                        user_status = True

                    else:

                        print(“wrong username or password!”)

 

                if user_status == True:

                    return func(*args,**kwargs) #
看这里看这里,只要说明通过了,就调用相应功能

            else:

                print(“only support qq “)

        return inner
#用户调用login时,只见面回去inner的内存地址,下次更调用时累加()才见面履inner函数

 

    return auth

 

def home():

    print(“—首页—-“)

 

@login(‘qq’)

def america():

    #login() #施行前增长验证

    print(“—-欧美专区—-“)

 

def japan():

    print(“—-日韩专区—-“)

 

@login(‘weibo’)

def henan(style):

    ”’

    :param style: 喜欢看什么品种的,就招上

    :return:

    ”’

    #login() #行前增长验证

    print(“—-河南专区—-“)

 

home()

# america = login(america) #汝当这里相当给将america这个函数替换了

#henan = login(henan)

 

# #这就是说用户调用时依旧写

america()

 

# henan(“3p”)

 

 

 

  

 

 

 

 

  

laravel
一.简介
二.运行条件要求
1.php 版本>=5.5.9
2.Mcrypt PHP扩展 php的加密扩展,提供多种加密算法
3.openssl恢弘 对传输的数开展加密
4.mbstring扩大 提供了针对性多字节字符串的函数,能够协助处理php多配节编码
5.Tokenizer PHP扩张 php代码片段解析
三.安装
1.composer安装
composer create-project laravel/laravel your-project-name –prefer-dist
“5.1.*”
2.直复制一客安装好的即可

3.软件目录结构正式

为什么要设计好目录结构?

“设计类目录结构”,就跟”代码编码风格”一样,属于个人风格问题。对于这种作风及之标准,一直都有个别栽态度:

  1. 同等近似同学认为,这种个人风格问题”无关紧要”。理由是能让程序work就哼,风格问题从来不是问题。
  2. 其余一样类同学认为,规范化能重复好之操纵次结构,让程序有所更胜之可读性。

本身是比偏于为后人的,因为自身是前面一样好像同学想行为下的第一手受害者。我一度维护了一个可怜不好读的类,其促成之逻辑并无复杂,但是可消耗了我很丰富之流年错开领悟它们想发挥的意思。从此我个人对于增强型可读性、可维护性的渴求就不行高了。”项目目录结构”其实呢是属”可读性和可维护性”的范围,我们统筹一个层次分明的目结构,就是为达到以下简单碰:

  1. 可读性强:
    不熟识这类型的代码的食指,一眼就会看明白目录结构,知道程序启动脚论是谁,测试目录在何处,配置文件于何处之类。从而充分快的打听是路。
  2. 可维护性高:
    定义好组织规则后,维护者就可知可怜明朗地理解,新增的哪位文件和代码应该放在什么目录之下。这个利益是,随着日的延迟,代码/配置的框框追加,项目布局不见面混杂,仍然能够组织好。

因此,我觉着,保持一个层次分明的目录结构是产生必要的。更何况组织一个良的工目录,其实是同样件非常简短的事宜。

目组织章程

关于怎样组织一个较好的Python工程目录结构,已经发一些拿走了共识之目录结构。在Stackoverflow的这个题目达成,能望大家对Python目录结构的议论。

此处面说的都很好了,我哉无打算再造轮子列举各种不同之方,这之中我说一样下我的晓和认知。

一旦你的门类名为也foo, 我于建议之无限方便快捷目录结构这样尽管足够了:

Foo/

|– bin/

|   |– foo

|

|– foo/

|   |– tests/

|   |   |– __init__.py

|   |   |– test_main.py

|   |

|   |– __init__.py

|   |– main.py

|

|– docs/

|   |– conf.py

|   |– abc.rst

|

|– setup.py

|– requirements.txt

|– README

简单解释一下:

  1. bin/: 存放项目之有的可执行文件,当然你可以打名script/之类的也行。
  2. foo/: 存放项目之兼具源代码。(1)
    源代码中的有模块、包都应该放在这目录。不要坐顶层目录。(2)
    其子目录tests/存放单元测试代码; (3) 程序的进口最好命名也main.py。
  3. docs/: 存放一些文档。
  4. setup.py: 安装、部署、打包的脚本。
  5. requirements.txt: 存放软件依赖之外部Python包列表。
  6. README: 项目说明文件。

除却,有有方案被有了一发多的情节。比如LICENSE.txt,ChangeLog.txt文件等,我从没排在此处,因为这些事物根本是路开源之时光用因此到。如果你想写一个开源软件,目录该如何组织,可以参考立刻篇稿子。

下面,再简单说一下本人本着这些目录的领悟以及私要求吧。

关于README的内容

以此自觉得是每个品种还该有一个文本,目的是会简单描述该档的信,让读者很快了解此路。

它需要说明以下几只事项:

  1. 软件定位,软件的基本功能。
  2. 运转代码的章程: 安装环境、启动命令等。
  3. 简简单单的运用说明。
  4. 代码目录结构说明,更详细点可以证明软件之基本原理。
  5. 常见问题求证。

本身看出上述几乎碰是比好的一个README。在软件开发初期,由于开发进程中上述内容恐怕未明显或发生变化,并无是得要以相同发端就是以享有消息还上全。但是于档次了之时,是得写作这样的一个文档的。

好参照Redis源码中Readme的写法,这间简洁而清晰的讲述了Redis功能和源码结构。

关于requirements.txt和setup.py

setup.py

相似的话,用setup.py来管理代码的包裹、安装、部署问题。业界规范的写法是为此Python流行的卷入工具setuptools来治本这些事情。这种艺术广泛利用被开源项目受到。不过此的核心思想不是为此标准的工具来缓解这些问题,而是说,一个色必然要是产生一个设置配置工具,能快方便的在平等令新机器上将环境装好、代码部署好及拿程序运行起来。

其一自是踩过坑的。

自家正好开头接触Python写项目的时候,安装环境、部署代码、运行程序是历程均是手动完成,遇到了以下问题:

  1. 安环境时常常忘记了多年来同时补加了一个新的Python包,结果一律到丝上运行,程序即使发出错了。
  2. Python包的版本依赖问题,有时候我们先后中利用的凡一个本的Python包,但是官方的都是最新的保了,通过手动安装就可能装错了。
  3. 若因的承保多以来,一个一个设置这些靠是生困难的事情。
  4. 乍校友开始写项目之时节,将次第走起老累,因为可能时时忘记了若怎么设置各种依赖。

setup.py可以将这些业务自动化起来,提高效率、减少失误的票房价值。”复杂的事物自动化,能自动化的物必定要是自动化。”是一个非常好之惯。

setuptools的文档比较大,刚接触的言辞,可能不极端好找到切入点。学习技能的主意尽管是看他人是怎么用底,可以参考一下Python的一个Web框架,flask是什么勾勒的: setup.py

自,简单点好写个装脚本(deploy.sh)替代setup.py也未尝不可。

requirements.txt

是文件在的目的是:

  1. 便民开发者维护软件之管依赖。将开过程遭到新增的包添加进这个列表中,避免以setup.py安装依赖时漏软件包。
  2. 造福读者明确项目利用了安Python包。

夫文件的格式是各一样推行包含一个包依赖的求证,通常是flask>=0.10这种格式,要求是者格式会于pip识别,这样即使可简单的经过 pip
install -r
requirements.txt来将拥有Python包依赖还装好了。具体格式说明: 点这里。

 

SEO 搜索引擎优化

迭代器

咱俩曾清楚,可以一直作用被for循环的数据类型有以下几种植:

同等像样是聚众数据类型,如list、tuple、dict、set、str等;

平接近是generator,包括生成器和带yield的generator function。

这些可以直接作用被for循环的对象统称为而迭代对象:Iterable。

可利用isinstance()判断一个对象是否是Iterable对象:

 

1

2

3

4

5

6

7

8

9

10

11

>>> from collections import Iterable

>>> isinstance([], Iterable)

True

>>> isinstance({}, Iterable)

True

>>> isinstance(‘abc’, Iterable)

True

>>> isinstance((x for x in range(10)), Iterable)

True

>>> isinstance(100, Iterable)

False

设生成器不但可以作用被for循环,还得让next()函数不断调用并赶回下一个值,直到最后抛来StopIteration错误表示无法持续回来下一个价了。

*好被next()函数调用并不断返回下一个价值的对象称为迭代器:Iterator

足利用isinstance()判断一个靶是不是是Iterator对象:

1

2

3

4

5

6

7

8

9

>>> from collections import Iterator

>>> isinstance((x for x in range(10)), Iterator)

True

>>> isinstance([], Iterator)

False

>>> isinstance({}, Iterator)

False

>>> isinstance(‘abc’, Iterator)

False

生成器都是Iterator对象,但list、dict、str虽然是Iterable,却未是Iterator。

管list、dict、str等Iterable变成Iterator可以用iter()函数:

1

2

3

4

>>> isinstance(iter([]), Iterator)

True

>>> isinstance(iter(‘abc’), Iterator)

True

卿或会见咨询,为什么list、dict、str等数据类型不是Iterator?

及时是以Python的Iterator对象表示的是一个数据流,Iterator对象足以为next()函数调用并连返回下一个数额,直到没有多少经常抛来StopIteration错误。可以拿这数据流看做是一个静止序列,但我们也未可知提前知道序列的长,只能不断通过next()函数实现按需计算下一个数码,所以Iterator的计算是惰性的,只有在待回到下一个多少常常她才见面精打细算。

Iterator甚至可以象征一个顶好的数据流,例如合自然数。而采取list是恒久不容许存储全体自然数的。

 

 

2.装饰器

而是如出一辙贱视频网站的后端开发工程师,你们网站发出以下几独版块

1

2

3

4

5

6

7

8

9

10

11

def home():

    print("—首页—-")

 

def america():

    print("—-欧美专区—-")

 

def japan():

    print("—-日韩专区—-")

 

def henan():

    print("—-河南专区—-")

视频正好上线初期,为了吸引用户,你们用了免费政策,所有视频免费观看,迅速引发了平万分批判用户,免费一段时间后,每天巨大的带来富费用公司接受不了了,所以准备对比较受欢迎的几乎单版块收费,其中囊括“欧美”

“河南”专区,你拿到此要求后,想了纪念,想收费得先被那个进行用户征,认证通过后,再判定是用户是否是VIP付费会员就得了,是VIP就受圈,不是VIP就不被看就是实施了嘛。
你道这个需求特别是概括,因为一旦指向几近个版块进行认证,那应该把证功能提取出单独写个模块,然后每个版块里调用
就可以了,与是公轻轻地的就算落实了脚的功力 。

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

#_*_coding:utf-8_*_

 

 

user_status = False #用户登录了就把这个改成True

 

def login():

    _username = "alex" #假装这是DB里存的用户信息

    _password = "abc!23" #假装这是DB里存的用户信息

    global user_status

 

    if user_status == False:

        username = input("user:")

        password = input("pasword:")

 

        if username == _username and password == _password:

            print("welcome login….")

            user_status = True

        else:

            print("wrong username or password!")

    else:

        print("用户已登录,验证通过…")

 

def home():

    print("—首页—-")

 

def america():

    login() #执行前加上验证

    print("—-欧美专区—-")

 

def japan():

    print("—-日韩专区—-")

 

def henan():

    login() #执行前加上验证

    print("—-河南专区—-")

 

 

 

home()

america()

henan()

这会儿而信心满满的将这个代码提交给你的TEAM
LEADER审核,没成思,没喽5分钟,代码就给从回来了, TEAM
LEADER给您反映是,我本产生成百上千模块需要加认证模块,你的代码虽然实现了作用,但是得改变需要加认证的逐一模块的代码,这一直违反了软件开发中之一个规则“开放-封闭”原则,简单来说,它规定就落实之功效代码不允许为修改,但好于扩张,即:

  • 封闭:已兑现之力量代码块不应当为涂改
  • 开放:对现有功能的扩充开放

夫规格而还是率先坏听说,我擦,再次感受了投机之野生程序员和正规军的差别,BUT
ANYWAY,老大要求的此怎么落实呢?如何在非移老职能代码的情事下增长认证功能也?你时想不起思路,只好带在这题目回家累按,媳妇不在家,去隔壁老王家串门了,你正好落的静,一不小心便悟出了化解方案,不改源代码可以呀,

汝师从沙河金角好手时,记得他教过您,高阶函数,就是拿一个函数当做一个参数传被另外一个函数,当时大王说,有平等天,你会为此到它们的,没悟出这是知识点突然从脑
里蹦出了,我不过待写个验证方式,每次调用 需要验证的功力 时,直接
把这功效 的函数誉为当一个参数 传为
我之辨证模块不就是尽了吗,哈哈,机智如己,如是公啪啪啪改写了事先的代码

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

#_*_coding:utf-8_*_

 

 

user_status = False #用户登录了就把这个改成True

 

def login(func): #把要执行的模块从这里传进来

    _username = "alex" #假装这是DB里存的用户信息

    _password = "abc!23" #假装这是DB里存的用户信息

    global user_status

 

    if user_status == False:

        username = input("user:")

        password = input("pasword:")

 

        if username == _username and password == _password:

            print("welcome login….")

            user_status = True

        else:

            print("wrong username or password!")

 

    if user_status == True:

        func() # 看这里看这里,只要验证通过了,就调用相应功能

 

def home():

    print("—首页—-")

 

def america():

    #login() #执行前加上验证

    print("—-欧美专区—-")

 

def japan():

    print("—-日韩专区—-")

 

def henan():

    #login() #执行前加上验证

    print("—-河南专区—-")

 

 

 

home()

login(america) #需要验证就调用 login,把需要验证的功能 当做一个参数传给login

# home()

# america()

login(henan)

卿很开心,终于实现了业主的渴求,不改原效力代码的前提下,给功能丰富了证明,此时,媳妇回来了,后面还随着老王,你少小关系
非常
好,老王经常来串门,老王也是码农,你与他享受了若勾勒的代码,兴奋之相当于他拘留完
夸奖你NB,没成思,老王看后,并没有称赞你,抱于你的子,笑笑说,你这代码还是改改吧,
要不然会吃开除的,WHAT? 会开除,明明实现了力量 呀, 老王说,没错,你功能
是兑现了,但是你而且犯了一个大忌,什么大忌? 

而改变了调用方式呀,
想同一思念,现在从不每个需要征的模块,都要调用你的login()方法,并把团结的函数名传于你,人家前可是这般调用
的, 试想,如果
有100单模块需要证明,那就100只模块都得转调用方式,这么多模块肯定不止是一个口形容的,让每个人重新夺窜调用方式
才会添加认证,你见面让骂那个的。。。。

您看老王说的针对,但问题是,如何不怕不改动原来效力代码,又无转移原有调用方式,还会加上认证为?
你苦思了一会,还是想不发,老王于引起你的小子打,你说,老王呀,快给自身点思路
,实在怀念不出去,老王背对正值公问问,

老王:学过匿名函数没有?

汝:学过学过,就是lambda嘛

老王:那lambda与正常函数的区分是什么?

公:最直接的分别是,正常函数定义时要写名字,但lambda不需要

老王:没错,那lambda定好后,为了多次调用 ,可否也吃它们命个叫?

卿:可以呀,可以写成plus = lambda
x:x+1类似这样,以后还调用plus就可以了,但这样不就是失了lambda的义了,明明户给匿名函数呀,你打了名来啊用啊?

老王:我莫是设同你谈谈她的意义 ,我怀念通过这叫您懂一个事实

说正在,老王以起而小子之画板,在面写了以下代码:

1

2

3

4

def plus(n):

    return n+1

 

plus2 = lambda x:x+1

老王: 上面立有限种植写法是无是代表 同样的意?

你:是的

老王:我给lambda x:x+1 起了只名字叫plus2,是免是一定给def plus2(x) ?

你:我擦,你变说,还真是,但老王呀,你想证明什么吧?

老王: 没啥,只想告知你,给函数赋值变量名就像def
func_name 是相同的功力,如下面的plus(n)函数,你调用时得为此plus名,还得再打个其他名字,如

1

2

3

calc = plus

 

calc(n)

您知我思传话什么意思了呢?

你:。。。。。。。。。。。这。。。。。。嗯 。。。。。不太。。。。明白
。。

老王:。。。。这。。。。。呵呵。。。。。。好吧。。。。,那我于为你沾转,你之前写的脚这段调用
认证的代码 

1

2

3

4

5

home()

login(america) #需要验证就调用 login,把需要验证的功能 当做一个参数传给login

# home()

# america()

login(henan)

您的所改变了调用方式,是坐用户每次调用时需实践login(henan),类似的。其实有点一改便足以了呀

1

2

3

home()

america = login(america)

henan = login(henan)

诸如此类您,其它食指调用henan时,其实一定给调用了login(henan),
通过login里之证明后,就会见活动调用henan功能。 

汝:我擦,还算唉。。。,老王,还是你nb。。。不过,等等,
我如此描写了好,那用户调用时,应该是下边这样子

1

2

3

4

5

6

home()

america = login(america) #你在这里相当于把america这个函数替换了

henan = login(henan)

 

#那用户调用时依然写

america()

可问题在,还不一用户调用 ,你的america =
login(america)就会先自己把america执行了呀。。。。,你当当我用户调用
的下 再实践才对呀,不信仰我尝试给你看。。。

老王:哈哈,你说的正确,这样打会油然而生这个题材? 但你思考有没有出解决办法
呢?

汝:我擦,你依靠的思绪呀,大哥。。。我呀知 下一致步怎么动。。。

 

老王:算了,估计你为想不下。。。 学过嵌套函数没有?

你:yes,然后呢?

老王:想实现平等开你勾勒的america =

 

生成器

经过列表生成式,我们得一直开立一个列表。但是,受到内存限制,列表容量肯定是简单的。而且,创建一个涵盖100万单元素的列表,不仅占用很死之贮存空间,如果我们一味用拜访前几独元素,那背后绝大多数素占用的半空中还白白浪费了。

故而,如果列表元素得以以某种算法推算出来,那我们是不是可以于循环的长河遭到不止推算出后续的元素呢?这样就算无须创建完整的list,从而省去大量底上空。在Python中,这种单方面循环一边盘算的建制,称为生成器:generator。

只要创一个generator,有充分多种方法。第一种植方法十分简短,只要将一个列表生成式的[]变动(),就创办了一个generator:

1

2

3

4

5

6

>>> L = [x * x for x in range(10)]

>>> L

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

>>> g = (x * x for x in range(10))

>>> g

<generator object <genexpr> at 0x1022ef630>

创建L和g的别就在于最外层的[]和(),L是一个list,而g是一个generator。

咱们得直接打印出list的各一个素,但咱怎么打印出generator的诸一个因素也?

若是一旦一个一个打印出,可以经next()函数获得generator的产一个返回值:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

>>> next(g)

0

>>> next(g)

1

>>> next(g)

4

>>> next(g)

9

>>> next(g)

16

>>> next(g)

25

>>> next(g)

36

>>> next(g)

49

>>> next(g)

64

>>> next(g)

81

>>> next(g)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

StopIteration

我们说过,generator保存的是算法,每次调用next(g),就计出g的生一个因素的值,直到计算到最后一个元素,没有重新多的元素时,抛来StopIteration的荒唐。

当,上面这种连调用next(g)实在是最最变态了,正确的方式是动for循环,因为generator也是只是迭代对象:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

>>> g = (x * x for x in range(10))

>>> for n in g:

…     print(n)

0

1

4

9

16

25

36

49

64

81

 

所以,我们创建了一个generator后,基本上永远不会见调用next(),而是经过for循环来迭代它,并且不需关爱StopIteration的荒唐。

generator非常有力。如果推算的算法比较复杂,用接近列表生成式的for循环无法落实之时段,还可据此函数来实现。

准,著名的斐波拉契数列(Fibonacci),除第一单跟次只数外,任意一个数还可由于前少个数相加得到:

1, 1, 2, 3, 5, 8, 13, 21, 34, …

斐波拉契数列用列表生成式写不出去,但是,用函数把其打印出来也分外轻:

1

2

3

4

5

6

7

def fib(max):

    n, a, b = 0, 0, 1

    while n < max:

        print(b)

        a, b = b, a + b

        n = n + 1

    return ‘done’

注意,赋值语句:

1

a, b = b, a + b

相当于:

1

2

3

t = (b, a + b) # t是一个tuple

a = t[0]

b = t[1]

然而不必显式写起临时变量t就得赋值。

面的函数可以出口斐波那契数列的前N个数:

1

2

3

4

5

6

7

8

9

10

11

12

>>> fib(10)

1

1

2

3

5

8

13

21

34

55

done

密切考察,可以看到,fib函数实际上是概念了斐波拉契数列的推算规则,可以起第一单要素开始,推算出后续任意的要素,这种逻辑其实深相近generator。

也就是说,上面的函数和generator仅一步之遥。要将fib函数变成generator,只待将print(b)改吧yield
b就可了:

 

def fib(max):

    n,a,b = 0,0,1

 

    while n < max:

        #print(b)

        yield  b

        a,b = b,a+b

 

        n += 1

 

    return ‘done’

 

马上就算是概念generator的另一样种办法。如果一个函数定义着包含yield关键字,那么这个函数就不再是一个屡见不鲜函数,而是一个generator:

>>> f = fib(6)

>>> f

<generator object fib at 0x104feaaa0>

这边,最难了解的哪怕是generator和函数的实施流程不同等。函数是逐一执行,遇到return语句或者最后一执函数报句就归。而成为generator的函数,在历次调用next()的时段实施,遇到yield语句返回,再次实施时由上次返回的yield语句处继续执行。

 

data = fib(10)

print(data)

 

print(data.__next__())

print(data.__next__())

print(“干点别的从业”)

print(data.__next__())

print(data.__next__())

print(data.__next__())

print(data.__next__())

print(data.__next__())

 

#输出

<generator object fib at 0x101be02b0>

1

1

波及点别的转业

2

3

5

8

13

 

在上头fib的例子,我们在循环过程遭到不断调用yield,就见面随地中断。当然要让循环设置一个尺度来退出循环,不然就会发一个最数列出来。

同等的,把函数改成为generator后,我们差不多没会就此next()来获取下一个返回值,而是径直动用for循环来迭代:

 

 

>>> for n in fib(6):

…     print(n)

1

1

2

3

5

8

 

然之所以for循环调用generator时,发现用不交generator的return语句的归值。如果想要用到回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

>>> g = fib(6)

>>> while True:

…     try:

…         x = next(g)

…         print(‘g:’, x)

…     except StopIteration as e:

…         print(‘Generator return value:’, e.value)

…         break

g: 1

g: 1

g: 2

g: 3

g: 5

g: 8

Generator return value: done

关于怎样捕获错误,后面的错误处理还会见详细讲解。

尚只是通过yield实现以单线程的状况下实现并作运算的力量  

经生成器实现协程并行运算

 

#_*_coding:utf-8_*_

__author__ = ‘Alex Li’

 

import time

def consumer(name):

    print(“%s 准备吃包子啦!” %name)

    while True:

       baozi = yield

 

       print(“包子[%s]来了,被[%s]吃了!” %(baozi,name))

 

 

def producer(name):

    c = consumer(‘A’)

    c2 = consumer(‘B’)

    c.__next__()

    c2.__next__()

    print(“老子开始准备召开包子啦!”)

    for i in range(10):

        time.sleep(1)

        print(“做了2个包子!”)

        c.send(i)

        c2.send(i)

 

producer(“alex”)

 

 

 

⑤.隐式控制器
(a).路由
Route::controller(‘users’,’UserController’);
//所有请求为users的 都由UserController来好
流动:运行artisan命令的当儿 要保证当前剧本不克发出报错

1.列表生成式,迭代器&生成器

十三.设置从定义函数和由定义类文件
1.成立出自定义文件 例如:app/common/function.php
2.在类型下的composer.json中补充加信息
“autoload”:{
“classmap”:[
“database”
],
“psr-4”:{
“App\\”:”app\”
},
“files”:[
“app/common/function.php”
]
}
3.dos界面中间composer dump-auto

2.chrome 插件 postman FQ 安装

@section(‘content’)
@show

 

四.本地域名解析与apapche虚拟主机配置(window下)
1.打开:C:\Windows\System32\drivers\etc目录中的hosts文件:
布局信息:127.0.0.1 自定义主机名

 

(b).新模板内容
@section(‘title’,’new Title’)

Route::get(‘/admin’, [
‘middleware’=>’admin’,
‘uses’=>function(){
echo ‘后台’;
},
]);

3.返回json return response()->json([“a”=>100,”b”=>2000]);

②.读取 \Cookie::get(‘name’);

2.在apache的conf\extra的httpd-vhosts.conf配置文件被配备
<VirtualHost *:80>
ServerAdmin chenxiaoyu@lampbrother.net
DocumentRoot “虚拟主机目录位置”
ServerName 虚拟主机名
ErrorLog “logs/虚拟主机名-error.log”
CustomLog “logs/虚拟主机名-access.log” common
</VirtualHost>

3.文本操作
①.检测是否发生文件及传 $request->hasFile(‘表单name值’);
②.用文件移动到指定位置
$request->file(‘表单name值’)->move(‘路径’,’新名字’);

@section(‘content’)
[ @parent ]
新内容
@endsection
4.流程控制
① 判断
@if($t==1)
处理
@elseif(count($records)>1)
处理
@else
处理
@endif
②.循环控制
@for($i=0; $i<10; $i++)
处理
@endfor
@foreach($users as $k=>$v)
处理
@endforeach

流动:配置虚拟主机出现的题目
①.布局好后 localhost不可知顾
②.配置好只能看根目录
③.hosts文件由不起
五.配置
1.开前务必使召开的
①.部署虚拟主机
②.storage 和 vendor 目录要为服务器出描绘副权限 linux
③.次密钥
(a).这里是默认生成的,如果无底口舌可采取命令
php artisan key:generate
(b).如果没key会报错
No supported encrypter found. The cipher and / or key length are
invalid.
④.改动时区
config/app.php ‘timezone’=>’PRC’
先建立出来 404 页面
404.blade.php

防止csrf攻击
打开 app/kernel.php 第20行

//上面的还并非记住

十二.数据库操作

//路由的门径的名字 和 public里面的文本夹的名字千万不要跟名 同名
默认走的public里面的文件夹 *****************

{{csrf_field()}} 生成了一个hidden 表单提交

2.出过程中要就此到之
①.读取和设置配置
(a).Config::get(‘app.timezone’);
(b).Config::set(‘app.timezone’,’PRC’);
②.落环境变量
(a).env(‘DB_HOST’,”);
③.关与起步以
(a).关闭 php artisan down 模版配置
resources/views/errors/503.blade.php
(b).开启 php artisan up
④.URL重写
public/.htaccess
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
六.路由于:将消息从源地址传递至目的地的角色 abort
1.文本位置:app/Http/routes.php
2.基本路由
①.Route::get(‘/admin’, function () {
return view(‘useradd’);
});
// controller@方法
②.Route::post(‘/admin’, function () {
return view(‘useradd’);
});
动post方式请求服务器的时段,可以预先以http/kernel.php 中的第20推行屏蔽
③.Route::put(); //修改
④.Route::delete(); //删除
3.带参数的路由
①.普通使用
Route::get(‘/goodsinfo/{id}’, function ($id) {
echo “商品的id是”.$id;
});
?a=123&b=456

十四.调节工具
1.debugbar安装
composer require barryvdh/laravel-debugbar

七.中间件
1.开立(默认不直生效)
php artisan make:middleware LoginMiddleware
2.事例代码
$ip=$request->ip();
$path=$request->path();
file_put_contents(‘./ips.txt’,$ip.’——‘.$path.”\r\n”,FILE_APPEND);

php语言 绝对路径 / 代表 盘符根目录
./ ../ 相对路径 入口文件 所于的目 public
html的绝对路径 / 当前之域名 所指定的目录 public

TokenMismatchException in VerifyCsrfToken.php line 53:
开启了csrf的保护
csrf

⑦.获取头信息 $arr=$request->header(‘Connection’);

 

十一.视图
1.分析模版 view(‘user.add’); // \ / 都可以
2.分配数目及模版
view(‘user.add’,[]);
3.模板引擎blade
①.模版底默认存放位置 resource/views
②.采用变量 {{$username}}
③.设置函数 {{time()}}
④.设置默认值 {{$user or ‘guest’}}
⑤.显示html代码 {!! $name !!}
⑥.引入子视图 @include(‘header’)
⑦.模版继承 @extends(‘index’)

4.cookie操作
①.设置 \Cookie::queue(‘cookie名’,’cookie值’,过期时空);

(b).使用
控制器中方法起名规则
public function 请求方式+路径(){}
例如:
所走访的门径是 users/add
public function getAdd(){}
⑥.restful 资源控制器
Route::resource(‘type’,’TypeController’);
九.请求
1.中坚信息获得取 了解
①.央方法 $request->method();
②.检测方法 $request->isMethod(‘post’);
③.告路径 $request->path();
④.请求完整url $request->url();
⑤.获取ip $request->ip();
⑥.获取端口 $request->getPort();

 

八.控制器
1.创办控制器
php artisan make:controller UserController –plain
2.路出于与走访
①.普通用法
Route::get(‘/stu/add’,’StuController@add’);
②.带参数访问
(a).路由带参数
Route::get(‘/stu/del/{id}’,[
‘uses’=>’StuController@del’,
]);
决定器函数 需要截取形参$id
public function del($id){}

总结 laravel里面 html代码 绝对路径 php代码 相对路径
echo “<img src=’1.jpg’>”; html 绝对路径
include file_get_content fopen ……. php 函数

路线的问题
相对路径 ../ ./ 绝对路径 /

在config/app.php里面的providers添加
Barryvdh\Debugbar\ServiceProvider::class,

③.别名
Route::get(‘/stu/del/{id}’,[
‘as’=>’udel’,
‘uses’=>’StuController@del’,
]);
④.中等件控制
(a).第一栽方式
Route::get(‘/admin’, [
‘middleware’=>’login’,
‘uses’=>’StuController@update’
]);
(b).第二种植方法
Route::get(‘/stu/update’,’StuController@update’)->Middleware(‘login’);

1.支持的数据库类型
mysql Postgres SQLite SQLServer
2.数据库连接配置
①.文件职 config/database.php
②..env环境快速布置
3.数据库基本操作
***********************************************
使用数据库的类的时光 一定要于点现引入命名空间
use DB;
否则
Class ‘App\Http\Controllers\DB’ not found
***********************************************

5.sql告诉词记录
①. app/Providers/AppServiceProvider.php
boot方法被上加
DB::listen(function($sql,$bindings,$time){
//写入sql
file_put_contents(‘.sqls’,”[“.date(“Y-m-d
H:i:s”).”]”.$sql.”\r\n”,FILE_APPEND);
});
②.
routes.php
Event::listen(‘illuminate.query’,function($query){
var_dump($query);
});

路线的问题
前台 html代码
绝对路径 / 域名 直接 绑定的 那个文件夹 public里面的物
未克写相对路径
php
绝对路径 / 当前项目所于的盘符的彻底目录
相对路径 ./ 当前进口文件所在的不二法门

 

②.克参数类型
Route::get(‘/user/{id}’,function($id){
echo $id;
})->where(‘id’,’\d+’);
4.传递多个参数
①.Route::get(‘/user/{name}/{id}’,function($name,$id){
echo $name;
echo “<br>”;
echo $id;
})->where(‘id’,’\d+’)->where(‘name’,’\d+’);
5.路由于别叫 少
①.Route::get(‘/admin/user/delete’,[
‘as’=>’udelete’,
‘uses’=>function(){
//快速获得改观地址
$url=route(‘udelete’);
echo ‘ok’;
}
]);
6.路出于组设置 middleware
①.Route::group([],function(){

⑤.一般语句 DB::statement(‘drop table users’);
* ⑥.事务操作 DB::beginTransaction()
DB::rollBack()
DB::commit()

* ⑦.操作多独数据库 DB::connection(‘数据库别名’)->select();

{{csrf_token()}} 生成了一个 token字符串 ajax

(b).原生参数 ?id=123
public function add(request $request){
$id=$request->input(‘id’);
echo $id;
}

post/getStu

3.注册app/Http/Kernel.php
①.全局注册:$middleware 命名空间\类名::class
\App\Http\Middleware\LoginMiddleware::class
①.局部注册:$routeMiddleware 别名=>命名空间\类名::class
‘login’=> \App\Http\Middleware\LoginMiddleware::class
4.使用

4.构造器
①.增删改查
(a).插入
单条: DB::table(‘stu’)->insert([‘name’=>’xy’,’age’=>46]);
多条:
DB::table(‘stu’)->insert([[‘name’=>’xy’,’age’=>46],[‘name’=>’xy’,’age’=>46]]);
获取id插入:
$id=DB::table(‘stu’)->insertGetId([‘name’=>’xy’,’age’=>46]);
(b).更新
DB::table(‘stu’)->where(‘id’,1)->update([‘name’=>’xy’])
(c).删除
DB::table(‘stu’)->where(‘id’,'<‘,’100’)->delete();
(d).查询
询问所有: DB::table(‘stu’)->get()
询问单条: DB::table(‘stu’)->first();
询问单条结果受到之有字段 DB::table(‘stu’)->value(‘name’)
落一列数据 DB::table(‘stu’)->lists(‘name’)
②.连贯操作
(a).设置字段名 DB::table(‘stu’)->select(‘name’,’email as
user_email’)->get();
(b).条件
DB::table(‘stu’)->where(‘name’,’like’,’%a%’);->get();
DB::table(‘stu’)->where(‘name’,’>’,’100′)->orwhere(‘name’,’xy’)->get()
DB::table(‘stu’)->whereBetween(‘id’,[1,5])->get()
DB::table(‘stu’)->whereIn(‘id’,[1,2,3])->get()
(b)排序 orderBy(‘name’,’desc’);
(c)分页 DB::table(‘stu’)->skip(10)->take(5)->get();
(d)分组 DB::table(‘stu’)->groupBy(‘name’)->having()->get();
(e)连接表
DB::table(‘stu’)->join(‘class’,’stu.cid’,’=’,’class.id’)->select(‘stu.name’,’class.cname’)->get();
(f)计算
总数 DB::table(‘stu’)->count();
最大值 DB::table(‘stu’)->max(‘price’) // min
平均值 DB::table(‘stu’)->avg(‘price’)

4.下充斥文件 return response()->download(‘web.config’);
5.页面跳反 return redirect(‘/goods/add’); return back(); //返回上亦然页
6.示模版 return response()->view(‘user’); return view(”);

①.查询 DB::select()
②.插入 DB::insert
③.更新 DB::update
④.删除 DB::delete

5.闪存信息:基于SESSION 用来存储请求参数的 session 关闭浏览器 flash
只要刷新一下页面 就失效 主要为此来开登记
①.将所有的要参数写副闪存中 $request->flash();
②.以一部分参数写副闪存中 $request->flashOnly(‘参数1′,’参数2’..);
③.除某些参数之外的参数 $request->flashExcept(‘参数1’);
④.简便使 return back()->withInput();

十.响应
1.返回字符串 return “string”; 相当给 echo
2.设置cookie return response(”)->withCookie(‘名’,’值’,时间);

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图