码迷,mamicode.com
首页 > 其他好文 > 详细

Questions

时间:2019-06-27 14:57:48      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:site   项目需求   声明   start   代码   append   min   pre   引用传递   

技术图片
#!/usr/bin/env python
# -*- coding: utf-8 -*-

#生成器中的元素只能从头到尾取一次,生成器不调用不执行
g1 = filter(lambda n:n%2==0,range(10))
g2 = map(lambda n:n*2,range(3))

print(list(g1),g1)  #[0, 2, 4, 6, 8]
print(list(g2),g2)  #[0, 2, 4]

for i in g1:
    for j in g2:
        print(i,j)
        print(i*j)   # 000


def multip():
    return [lambda x:i*x for i in range(4)]
print([m(2) for m in multip()])

"""
拆分 1:
"""
def multip():
    fun_list=[]
    for i in range(4):
        fun = lambda x:i*x
        fun_list.append(fun)
    return fun_list
print([m(2) for m in multip()])


"""
拆分 2:
"""
def multip():
    fun_list=[]
    i = 0
    fun = lambda x:i*x
    fun_list.append(fun)

    i = 1
    fun = lambda x:i*x
    fun_list.append(fun)

    i = 2
    fun = lambda x:i*x
    fun_list.append(fun)

    i = 3
    fun = lambda x:i*x
    fun_list.append(fun)

    #此时i已经等于3了,fun_list=[lambda x:i*x,lambda x:i*x,lambda x:i*x,lambda x:i*x]
    #特别注意 lambda一直没有调用。
    return fun_list

print([m(2) for m in multip()])   #  [6, 6, 6, 6]


"""
要得到[0,2,4,6],方式1:
"""
def multip():
    for i in range(4):
        yield lambda x:i*x
print([m(2) for m in multip()])  #[0, 2, 4, 6]

"""
要得到[0,2,4,6],方式2:
"""
def multip():
    return (lambda x:i*x for i in range(4))
print([m(2) for m in multip()])
生成器
技术图片
#!/usr/bin/env python
# -*- coding: utf-8 -*-
lst = [,周星星,麻花藤,周扒皮]

for i in range(len(lst)-1,-1,-1):
    print(i,range(len(lst)-1,-1,-1))
    if lst[i][0] ==:
        lst.pop(i)
print(lst)
‘‘‘
3 range(3, -1, -1)
2 range(2, -1, -1)
1 range(2, -1, -1)
0 range(1, -1, -1)
[‘麻花藤‘]
‘‘‘

lst = [,周星星,麻花藤,周扒皮]
lst1=[]
for i in lst:
    if i.startswith():
        lst1.append(i)
for j in lst1:
        lst.remove(j)
print(lst) #[‘麻花藤‘]
列表
技术图片
#! /user/bin/env python
# -*- coding: utf-8 -*-
def fib(max):
    n,a,b = 0,0,1
    while n < max:
        yield  b
        a,b = b,a+b
        n += 1
    return haha


print(fib(6).__next__(),id(fib(6).__next__()))  #操作fib(6)这个生成器
print(fib(6).__next__(),id(fib(6).__next__()))  #操作又一个fib(6)这个生成器
print(fib(6).__next__(),id(fib(6).__next__()))  #操作又一个新生成的fib(6)这个生成器
#函数名()的到的结果就是生成器,上面始终在操作新的生成器

pro=fib(6)  #生成一个生成器
print(pro.__next__(),id(pro.__next__()))  #操作这个已经生成的生成器pro
print(pro.__next__(),id(pro.__next__()))  #操作这个已经生成的生成器pro
print(pro.__next__(),id(pro.__next__()))  #操作这个已经生成的生成器pro
#函数名()的到的结果就是生成器,上面操作的一直是Pro这一个生成器

#你从__next__()的id就能看出,fib(6)是新生成的生成器。
生成器
技术图片
#! /user/bin/env python
# -*- coding:utf-8 -*-

# 运行代码的时候把其他重名函数注释了看效果。

def fun():
    temp=[lambda x:x*i for i in range(4)]
    return temp
for every in fun():
    print(every(2))

#上面的代码可以写成这样,这样你就能看的更清楚一些
def func():
    temp = []
    for i in range(4):
        def foo(x):
            # print(i)
            # 这可以打印了看看i的值,已经是3了,函数foo中没有变量i,按照函数作用域的查找顺序就向外找
            # 外部函数func中寻找变量 i ,但此时外部的 for 已经循环完毕,最后的 i =3
            # 所以,每次执行every(2),i 的值都是 3 ,因此,最终结果会是 [6, 6, 6, 6] 。
            return x*i
        temp.append(foo)
    return temp
for every in func():
    print(every(2))


# #补充:如果你想运用每次循环中i的值,就把i当参数传进去
def func():
    temp = []
    for i in range(4):
        def foo(x,i=i):
            # 为什么这不写成foo(x,i)?
            # 原因1:你看看every(2)的调用方式是不是只有一个参数,说明i这个参数要有默认值
            # 原因2:又想把每次循环中的i传进去就可以这样写 i=i
            return x*i
        temp.append(foo)
    return temp
for every in func():
    print(every(2))

# #补充: 如果上面的代码发懵的话,改一下形参的名称如下和上面是一样的效果:
def func():
    temp = []
    for i in range(4):
        def foo(x,y=i):
            return x*y
        temp.append(foo)
    return temp
for every in func():
    print(every(2))


#补充用匿名函数写的话就是这样: 第二个形参名称为y
def fun():
    temp=[lambda x,y=i:x*y for i in range(4)]
    return temp
for every in fun():
    print(every(2))

#补充用匿名函数写的话就是这样: 第二个形参名称为i
def fun():
    temp=[lambda x,i=i:x*i for i in range(4)]
    return temp
for every in fun():
    print(every(2))
函数
技术图片
#! /user/bin/env python
# -*- coding:utf-8 -*-
# def outer():
#     n = 5
#     def inner():
#         nonlocal n
#         n = n + 1
#         print(n)
#     # print(n)
#     return inner
# f = outer()
# f()
# f()


#首先看明白下面这段代码:
gcount = 0
def global_test():
    global gcount
    gcount += 1  # 这里是+= 已经对gcount 重新赋值了
    print(gcount)
global_test() #打印1
global_test() #打印2
global_test() #打印3
print(gcount) #打印3

#global关键字用来在函数或其他局部作用域中使用全局变量。
#上面的代码应该看的懂,那你就只需要知道nonlocal的作业是什么。举一反三就出来了,是一样的原理。
#nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量。
nonlocal
技术图片
"""
1. 把有依赖关系的类放到容器中,解析出这些类的实例,就是依赖注入。目的是实现类的解耦。

2. 控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

3. Class A中用到了Class B的对象b,一般情况下,需要在A的代码中显式的new一个B的对象。采用依赖注入技术之后,A的代码只需要定义一个私有的B对象,不需要直接new来获得这个对象,而是通过相关的容器控制程序来将B对象在外部new出来并注入到A类里的引用中。而具体获取的方法、对象被获取时的状态由配置文件(如XML)来指定。

"""
class Mapper:
    # 在字典里定义依赖注入关系
    __mapper_relation = {}

    # 类直接调用注册关系
    @staticmethod
    def register(cls, value):
        Mapper.__mapper_relation[cls] = value

    @staticmethod
    def exist(cls):
        if cls in Mapper.__mapper_relation:
            return True
        return False

    @staticmethod
    def get_value(cls):
        return Mapper.__mapper_relation[cls]


class MyType(type):
    def __call__(cls, *args, **kwargs):
        obj = cls.__new__(cls, *args, **kwargs)
        arg_list = list(args)
        if Mapper.exist(cls):
            value = Mapper.get_value(cls)
            arg_list.append(value)
        obj.__init__(*arg_list, **kwargs)
        return obj

class Head:
    def __init__(self):
        self.name = alex

class Foo(metaclass=MyType):
    def __init__(self, h):
        self.h = h
    def f1(self):
        print(self.h)

class Bar(metaclass=MyType):
    def __init__(self, f):
        self.f = f
    def f2(self):
        print(self.f)

Mapper.register(Foo, Head())
Mapper.register(Bar, Foo())

b = Bar()
print(b.f,type(b.f))
#<__main__.Foo object at 0x00000000043C5390> <class ‘__main__.Foo‘>

f = Foo()
print(f.h,type(f.h))
#<__main__.Head object at 0x00000000041C6240> <class ‘__main__.Head‘>
依赖注入
技术图片
def home(request,site):
    blog = models.Blog.objects.filter(site=site).first()
    if not blog:
        return redirect(/)

    # 当前博客所有文章
    # models.Article.objects.filter(blog=blog)

    # 当前博客所有分类
    # 方式1:
    # cate_list = models.Category.objects.filter(blog=blog)
    # for item in cate_list:
    #     c = item.article_set.all().count()
    #     print(item,c)
    
    # 方式2:
    # from django.db.models import Count
    # category_list = models.Article.objects.filter(blog=blog).values(‘category_id‘,‘category__title‘,).annotate(c=Count(‘nid‘))
    
    # SQL语句:    
    # select category_id,category__title,count(nid) as c from article where blog_id=1 group by category_id and category__title

    # 获取博客标签
    # 方式1:
    # tag_list = models.Tag.objects.filter(blog=blog)
    # for tag in tag_list:
    #     c = tag.article_set.all().count()
    #     print(tag,c)
    
    # 方式2:
    from django.db.models import Count
    # models.Article2Tag.objects.filter(tag__blog=blog).values(‘tag_id‘,‘tag__title‘).annotate(c=Count(‘id‘))


    # 自己没有创建Article2Tag表时:
    # v1 = models.Article.objects.filter(blog=blog).values(‘nid‘,‘title‘)
    # print(v1.query) 查看SQL语句
    # v2 = models.Article.objects.filter(blog=blog).values(‘tags__id‘,‘tags__title‘).annotate(c=Count(‘nid‘))


    # 时间分类:
    # models.Article.objects.filter(blog=blog).values(‘create_time‘).annotate(c=Count(‘nid‘))
    # select createtime,count(nid) as c from article where blog_id=1 group by create_time

    # select date_format(create_time,‘%Y-%m‘),count(nid) as c from article where blog_id=1 group by date_format(create_time,‘%Y-%m‘)
    # 2015-09  10
    # 2015-10  8

    # MySQL
    # date_list = models.Article.objects.filter(blog=blog).extra(select={‘c‘: "date_format(create_time,‘%%Y-%%m‘)"}).values(‘c‘).annotate(ct=Count(‘nid‘))
    # SQLlite
    # date_list = models.Article.objects.filter(blog=blog).extra(select={‘c‘: "strftime(‘%%Y-%%m‘,create_time)"}).values(‘c‘).annotate(ct=Count(‘nid‘))

    """
    nid xx   create_time            c
     1  x     2018-01-01 11:11    2018-01

    """
    # 小结:
    """
    1. 分类
        category_list = models.Article.objects.filter(blog=blog).values(‘category_id‘,‘category__title‘,).annotate(c=Count(‘nid‘))
    2. 标签
        tag_list = models.Article2Tag.objects.filter(tag__blog=blog).values(‘tag_id‘,‘tag__title‘).annotate(c=Count(‘id‘))
    3. 时间
        # MySQL
        # date_list = models.Article.objects.filter(blog=blog).extra(select={‘c‘: "date_format(create_time,‘%%Y-%%m‘)"}).values(‘c‘).annotate(ct=Count(‘nid‘))
        # SQLlite
        # date_list = models.Article.objects.filter(blog=blog).extra(select={‘c‘: "strftime(‘%%Y-%%m‘,create_time)"}).values(‘c‘).annotate(ct=Count(‘nid‘))

    """
    #django中的列不能是其他,只能是已经存在的列名,下面的写法不对:
    date_list = models.Article.objects.filter(blog=blog).values("date_format(create_time,‘%%Y-%%m‘)").annotate(ct=Count(nid))

    # 了解ORM内置基础函数:
    from django.db.models import functions
    # models.Article.objects.filter(blog=blog).annotate(x=functions.Extract(‘create_time‘,‘YEAR_MONTH‘))
    # models.Article.objects.filter(blog=blog).annotate(x=functions.ExtractYear(‘create_time‘))
    """
    nid xx   create_time            x
     1  x     2018-09-01 11:11      201809


    """
    # models.Article.objects.filter(blog=blog).annotate(x=functions.TruncMonth(‘create_time‘))
    # models.Article.objects.filter(blog=blog).annotate(x=functions.Trunc(‘create_time‘,‘‘))
    """
    nid xx   create_time            x
     1  x     2018-09-01 11:11      09


    """
    # from django.db.models import FloatField
    # from django.db.models import Value
    # v = models.Article.objects.annotate(c=functions.Cast(‘nid‘, FloatField()))
    # v = models.Article.objects.annotate(c=functions.Coalesce(‘title‘,‘summary‘))
    # v = models.Article.objects.annotate(c=functions.Concat(‘nid‘,‘title‘,‘summary‘))
    # v = models.Article.objects.annotate(c=functions.Concat(‘nid‘,‘title‘,‘summary‘,Value(‘666‘)))
    # v = models.Article.objects.annotate(c=functions.Greatest(‘nid‘,‘num‘))
    # v = models.Article.objects.annotate(c=functions.Length(‘title‘))
    # v = models.Article.objects.annotate(c=functions.Substr(‘title‘,1,1))
    #
    # """
    # select *,upper(title) from xxx
    # nid title summary   create_time      num        c
    #  1   xx        s   2018-09-01 11:11    9        x
    # """

    from django.db.models.functions.base import Func
    class YearMonthFunc(Func):
        function = DATE_FORMAT
        template = %(function)s(%(expressions)s,%(format)s)

        def __init__(self, expression, **extra):
            expressions = [expression]
            super(YearMonthFunc, self).__init__(*expressions, **extra)

    v = models.UserInfo.objects.annotate(c=YearMonthFunc(create_time,format="‘%%Y-%%m‘"))

    """
    大结:
        1. 项目需求
            一对多,分组
            多对多,分组
            单表函数格式化,分组

            示例:
                1. 分类
                    category_list = models.Article.objects.filter(blog=blog).values(‘category_id‘,‘category__title‘,).annotate(c=Count(‘nid‘))
                2. 标签
                    tag_list = models.Article2Tag.objects.filter(tag__blog=blog).values(‘tag_id‘,‘tag__title‘).annotate(c=Count(‘id‘))
                3. 时间
                    # MySQL
                    # date_list = models.Article.objects.filter(blog=blog).extra(select={‘c‘: "date_format(create_time,‘%%Y-%%m‘)"}).values(‘c‘).annotate(ct=Count(‘nid‘))
                    # SQLlite
                    # date_list = models.Article.objects.filter(blog=blog).extra(select={‘c‘: "strftime(‘%%Y-%%m‘,create_time)"}).values(‘c‘).annotate(ct=Count(‘nid‘))
        2. Django ORM内置函数,额外再取一列数据
            函数:
                - 基础
                    Cast, Coalesce, Concat, ConcatPair, Greatest, Least, Length, Lower, Now, Substr, Upper,
                - 时间
                    Extract, ExtractDay, ExtractHour, ExtractMinute, ExtractMonth,ExtractSecond, ExtractWeekDay, ExtractYear, Trunc, TruncDate, TruncDay,TruncHour, TruncMinute, TruncMonth, TruncSecond, TruncYear,
            # from django.db.models import FloatField
            # from django.db.models import Value
            # v = models.Article.objects.annotate(c=functions.Cast(‘nid‘, FloatField()))
            # v = models.Article.objects.annotate(c=functions.Coalesce(‘title‘,‘summary‘))
            # v = models.Article.objects.annotate(c=functions.Concat(‘nid‘,‘title‘,‘summary‘))
            # v = models.Article.objects.annotate(c=functions.Concat(‘nid‘,‘title‘,‘summary‘,Value(‘666‘)))
            # v = models.Article.objects.annotate(c=functions.Greatest(‘nid‘,‘num‘))
            # v = models.Article.objects.annotate(c=functions.Length(‘title‘))
            # v = models.Article.objects.annotate(c=functions.Substr(‘title‘,1,1))
        3. 自定义
            from django.db.models.functions.base import Func
            class YearMonthFunc(Func):
                function = ‘DATE_FORMAT‘
                template = ‘%(function)s(%(expressions)s,%(format)s)‘

                def __init__(self, expression, **extra):
                    expressions = [expression]
                    super(YearMonthFunc, self).__init__(*expressions, **extra)

            v = models.UserInfo.objects.annotate(c=YearMonthFunc(‘create_time‘,format="‘%%Y-%%m‘"))

    """

    return HttpResponse(...)
blog

 

Questions

标签:site   项目需求   声明   start   代码   append   min   pre   引用传递   

原文地址:https://www.cnblogs.com/bubu99/p/11096848.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!