标签: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声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量。
""" 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(‘...‘)
标签:site 项目需求 声明 start 代码 append min pre 引用传递
原文地址:https://www.cnblogs.com/bubu99/p/11096848.html