Code Life of gladuo - python
type: channel
link: https://tech.gladuo.com/tag/python/
items: Transforming Code into Beautiful, Idiomatic Python
items: Workflow for Django
items: 关于Python中文的一切
items: Relative Imports——python模块相对路径导入

Transforming Code into Beautiful, Idiomatic Python
type: item
date: 2016-08-27T16:31:00+00:00
description: 本文内容可以在这里下载 http://tech.gladuo.com/beautiful_idiomatic_python.htmlNotes from Raymond Hettinger's talk at pycon US 2013 video, slides.The code examples and direct quotes are all from Raymond's talk. I've reproduced them here for my own edification and the hopes that others will find them as handy as I have!Looping over a range of numbersfor i in [0, 1, 2, 3, 4, 5]: print i**2 for i in range(6): print i**2Betterfor i in xrange(6): print i**2xrange creates an iterator over the range producing the values one at a time. This approach is much more memory efficient than range. xrange was renamed to range in python 3.Looping over a collectioncolors = ['red', 'green', 'blue', 'yellow'] for i in range(len(colors)): print colors[i]Betterfor color in colors: print colorLooping backwardscolors = ['red', 'green', 'blue', 'yellow'] for i in range(len(colors)-1, -1, -1): print colors[i]Betterfor color in reversed(colors): print colorLooping over a collection and indicescolors = ['red', 'green', 'blue', 'yellow'] for i in range(len(colors)): print i, '--->', colors[i]Betterfor i, color in enumerate(colors): print i, '--->', colorIt's fast and beautiful and saves you from tracking the individual indices and incrementing them.Whenever you find yourself manipulating indices [in a collection], you're probably doing it wrong.Looping over two collectionsnames = ['raymond', 'rachel', 'matthew'] colors = ['red', 'green', 'blue', 'yellow'] n = min(len(names), len(colors)) for i in range(n): print names[i], '--->', colors[i] for name, color in zip(names, colors): print name, '--->', colorBetterfor name, color in izip(names, colors): print name, '--->', colorzip creates a new list in memory and takes more memory. izip is more efficient than zip.Note: in python 3 izip was renamed to zip and promoted to a builtin replacing the old zip.Looping in sorted ordercolors = ['red', 'green', 'blue', 'yellow'] # Forward sorted order for color in sorted(colors): print colors # Backwards sorted order for co…

Workflow for Django
type: item
date: 2016-02-09T17:37:00+00:00
description: Workflow for DjangoGithubadd / create / clone repoadd / commitsyncrevert虚拟环境mkvirtualenv project_namermvirtualenv project_namesetvirtualenvproject project_name PATHworkon project_namedeactiveStart Projectdjango-admin.py startproject project_namepython manage.py migratepython manage.py runserverStart App1. Start Apppython manage.py startapp app_name2. 修改 settings.py在project_name的settings.py文件中，找到INSTALLED_APPS列表，在列表的最后面增加 app_nameINSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app_name', ]3. 创建视图在app_name目录内的views.py文件中，删除注释# Create your views here.，创建视图def index(request): context_dict = {'boldmessage': "I am bold font from the context"} return render(request, 'rango/index.html', context_dict)4. 应用 URL 映射在app_name目录中，创建一个叫做urls.py的文件。from django.conf.urls import patterns, url from rango import views urlpatterns = [ url(r'^$', views.index, name='index')]5. 项目 URL 映射在project_name/project_name/urls.py中，更新urlpatterns列表。urlpatterns = [ url(r'^admin/', include(admin.site.urls)), url(r'^app_name/', include('app_name.urls')) # for example ]使用模板1. 创建目录在project_name/创建一个templates目录，在这个目录中为每一个 app 建立一个目录，例如 project_name/templates/app_name，用来存放app_name应用下的模板2. 在 settings.py 中设置在setting.py中创建TEMPLATE_PATH变量，用它来储存 templates 目录。这里我们使用os.path.join()函数。TEMPLATE_PATH = os.path.join(BASE_DIR, 'templates')TEMPLATE_DIRS = [ # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". # Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. TEMPLATE_PATH, ]3. 添加模板在template/app_name/目录里建立一个叫做index.html的文件,在新文件里加入下面代码： App App says... hello world! {{ boldmessage }} About 4. 在 views.py 中 renderfrom django.shortcuts import render def index(request): # Construct a dictionary to pass to the template engine as its context. # Note the key boldmessage is the same as {{ boldmessage }} in the temp…

关于Python中文的一切
type: item
date: 2015-03-28T16:39:00+00:00
description: 编码的历史ASCIIASCII(American Standard Code forInformation Interchange)，是一种单字节的编码。计算机世界里一开始只有英文，而单字节可以表示256个不同的字符，可以表示所有的英文字符和许多的控制符号。不过ASCII只用到了其中的一半（\x80以下），这也是MBCS得以实现的基础。MBCS然而计算机世界里很快就有了其他语言，单字节的ASCII已无法满足需求。后来每个语言就制定了一套自己的编码，由于单字节能表示的字符太少，而且同时也需要与ASCII编码保持兼容，所以这些编码纷纷使用了多字节来表示字符，如GBxxx、BIGxxx等等，他们的规则是，如果第一个字节是\x80以下，则仍然表示ASCII字符；而如果是\x80以上，则跟下一个字节一起（共两个字节）表示一个字符，然后跳过下一个字节，继续往下判断。这里，IBM发明了一个叫Code Page的概念，将这些编码都收入囊中并分配页码，GBK是第932页，也就是CP932。所以，也可以使用CP932表示GBK。MBCS(Multi-Byte Character Set)是这些编码的统称。目前为止大家都是用了双字节，所以有时候也叫做DBCS(Double-Byte Character Set)。必须明确的是，MBCS并不是某一种特定的编码，Windows里根据你设定的区域不同，MBCS指代不同的编码，而Linux里无法使用MBCS作为编码。在Windows中你看不到MBCS这几个字符，因为微软为了更加洋气，使用了ANSI来吓唬人，记事本的另存为对话框里编码ANSI就是MBCS。同时，在简体中文Windows默认的区域设定里，指代GBK。Unicode后来，有人开始觉得太多编码导致世界变得过于复杂了，让人脑袋疼，于是大家坐在一起拍脑袋想出来一个方法：所有语言的字符都用同一种字符集来表示，这就是Unicode。最初的Unicode标准UCS-2使用两个字节表示一个字符，所以你常常可以听到Unicode使用两个字节表示一个字符的说法。但过了不久有人觉得256*256太少了，还是不够用，于是出现了UCS-4标准，它使用4个字节表示一个字符，不过我们用的最多的仍然是UCS-2。UCS(Unicode Character Set)还仅仅是字符对应码位的一张表而已，比如"汉"这个字的码位是6C49。字符具体如何传输和储存则是由UTF(UCS Transformation Format)来负责。一开始这事很简单，直接使用UCS的码位来保存，这就是UTF-16，比如，"汉"直接使用\x6C\x49保存(UTF-16-BE)，或是倒过来使用\x49\x6C保存(UTF-16-LE)。但用着用着美国人觉得自己吃了大亏，以前英文字母只需要一个字节就能保存了，现在大锅饭一吃变成了两个字节，空间消耗大了一倍……于是UTF-8横空出世。UTF-8是一种很别扭的编码，具体表现在他是变长的，并且兼容ASCII，ASCII字符使用1字节表示。然而这里省了的必定是从别的地方抠出来的，你肯定也听说过UTF-8里中文字符使用3个字节来保存吧？4个字节保存的字符更是在泪奔……（具体UCS-2是怎么变成UTF-8的请自行搜索）另外值得一提的是BOM(Byte Order Mark)。我们在储存文件时，文件使用的编码并没有保存，打开时则需要我们记住原先保存时使用的编码并使用这个编码打开，这样一来就产生了许多麻烦。（你可能想说记事本打开文件时并没有让选编码？不妨先打开记事本再使用文件-> 打开看看）而UTF则引入了BOM来表示自身编码，如果一开始读入的几个字节是其中之一，则代表接下来要读取的文字使用的编码是相应的编码：BOM_UTF8 '\xef\xbb\xbf' BOM_UTF16_LE '\xff\xfe' BOM_UTF16_BE '\xfe\xff' 并不是所有的编辑器都会写入BOM，但即使没有BOM，Unicode还是可以读取的，只是像MBCS的编码一样，需要另行指定具体的编码，否则解码将会失败。你可能听说过UTF-8不需要BOM，这种说法是不对的，只是绝大多数编辑器在没有BOM时都是以UTF-8作为默认编码读取。即使是保存时默认使用ANSI(MBCS)的记事本，在读取文件时也是先使用UTF-8测试编码，如果可以成功解码，则使用UTF-8解码。记事本这个别扭的做法造成了一个BUG：如果你新建文本文件并输入"姹塧"然后使用ANSI(MBCS)保存，再打开就会变成"汉a"，你不妨试试python中的编码python中的str和unicodepython中的str和unicodepython中的字符串有两种：str和unicode。str和unicode都是basestrin…

Relative Imports——python模块相对路径导入
type: item
date: 2015-01-29T18:22:00+00:00
description: 在看的时候，在引入blueprint之后看到了类似from ...foo import bar这样的代码段，这种导入包的方式前所未见，甚至让我产生了这是一个blueprint的封装过的导入方式的错觉，但是总觉得哪哪都不对劲。翻遍了整个书，没有看到对这种“新花样”的解释——甚至专门买来中文版，来看看我有没有什么漏掉的东西，结果一无所获。然后便以Flask import 类似的词语Google还是没有什么结果，期间读到了一份很好的python网页教程，最终终于意识到python知识还很缺乏，这应该是某种导入包的“新”的黑魔法。断断续续在一些blog上看到了关于相对路径导入的信息，在PEP8这个页面看到了推荐使用绝对路径，而相对路径是可接受的，理由是Absolute imports are recommended, as they are usually more readable and tend to be better behaved这理由我就简洁的不能信服了，虽然是python官方的说法。晚上回来调DEV-CPP还是不乖，大概是这辈子遇到的最心塞的事了，就像喜欢一个妹子，不断满足她的下限，到现在已经到了再也不能下的下限了，她还不满意，此时我只想说，你TMD赶紧听话，不然我哭给你看。。。打开python页面搜索relative imports最终还是搜到了想要的内容，Guido's DecisionGuido has Pronounced [1] that relative imports will use leading dots. A single leading dot indicates a relative import,starting with the current package. Two or more leading dots give arelative import to the parent(s) of the current package, one level perdot after the first. Here's a sample package layout: package/ __init__.py subpackage1/ __init__.py moduleX.py moduleY.py subpackage2/ __init__.py moduleZ.py moduleA.py Assuming that the current file is either moduleX.py or subpackage1/__init__.py , following are correct usages of the newsyntax:from .moduleY import spam from .moduleY import spam as ham from .import moduleY from ..subpackage1 import moduleY from..subpackage2.moduleZ import eggs from ..moduleA import foo from...package import bar from ...sys import path Note that while thatlast case is legal, it is certainly discouraged ("insane" was the wordGuido used).Relative imports must always use from <> import ; import <> is alwaysabsolute. Of course, absolute imports can use from <> import byomitting the leading dots. The reason import .foo is prohibited isbecause afterimport XXX.YYY.ZZZ thenXXX.YYY.ZZZ is usable in an expression. But.moduleY is not usable in an expression.很清楚了，一个点代表同级目录，多一个点往上一级，上到最高就等于整个PATH环境了。而且，relative import 只支持 from <> import <> 这种结构。Gudio's decision，很吊的样子，想起来了I write python的梗。喜欢有一点点约束的最佳实践。人生苦短，我用python，晚安。