Monday, March 26, 2018

Python Misc Part 2



def log(self, msg):
    print "{} {}".format(time.strftime("%Y-%m-%d %H:%M"), msg)
https://google.github.io/styleguide/pyguide.html


Imports should be on separate lines.
E.g.:
Yes: import os
     import sys
No:  import os, sys
Imports are always put at the top of the file, just after any module comments and doc strings and before module globals and constants. Imports should be grouped with the order being most generic to least generic:
  • standard library imports
  • third-party imports
  • application-specific imports
Within each grouping, imports should be sorted lexicographically, ignoring case, according to each module's full package path.
import foo
from foo import bar
from foo.bar import baz
from foo.bar import Quux
from Foob import ar

https://www.jetbrains.com/help/pycharm/quick-start-guide.html
If you want to concentrate on your own code, use the Step Into My Code button (step into my code) - thus you'll avoid stepping into library classes.
Shortcut
Option+F8 - Evaluating expressions

quick fix:  option + return
The Code | Generate menu (⌘N

http://www.raychase.net/4627

Tuple。Tuple的最直接好处是不可变,它时常也被作为容器不同格式之间转换和过渡的媒介,再一个,正因为有了Tuple,让函数“看起来”具备多个返回值也就变成了可能,以前在Scala中也使用过。印象中传统语言里面没有这样原生的东西,比如Java的final关键字除了不可变以外并不具备Tuple其它的特性。
可变参数:在Java中可变参数其实就是一个数组的语法糖,二者本质上没有什么区别。所以可以传一个数组给变参方法,数组会被准确解析成变参;反过来转换也一样——在变参方法中,变参一拿到手就已经是一个数组了,Python为了变参更舒服地调用而设计了展开符号——*。**则是关键字参数,和*被解析成[]不同的是,**被解析成{},这个我在别的语言里面似乎没有见到类似的。如果不是说方法定义,而是说方法调用,那么它似乎和JavaScript ECMA 6中的…类似,可以传递若干键值对(命名参数)。
尾递归优化(Tail Recursion Elimination, TRE)。这其实可以作为语言分类上的一个重要特性,Python不支持尾递归优化,后续有机会再单写一篇来详细谈谈。
List Comprehension。我第一次接触它是在Haskell里(曾经写过一点点东西涉及到它)。它让代码的简洁程度到达一个新的级别,比如下面这样的两个例子:
1
2
[x * x for x in range(1, 100) if x % 2 == 1]
[m + n for m in 123' for n in 'abc']
从yield到generator。yield这个关键字不仅仅可以让函数多次返回,虽说这已经是一个颇为有趣的事情了,我在其他语言中我没有见到过。它还可以让函数变成generator——其中一种简单的定义方法是,如果函数定义中包含yield,那么它就成为了一个generator,用于不断生成结果并返回。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。看这个例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def _odd_iter():
    n = 1
    while True:
        n = n + 2
        yield n
def m_of_three():
    iter = _odd_iter()
    while True:
        n = next(iter)
        if n%3 == 0:
            yield n
for n in m_of_three():
    if n < 100:
        print(n)
    else:
        break
例子中第一个generator _odd_iter用来返回从1开始的所有奇数,而m_of_three生成器用来过滤并返回其中3的倍数,最后一部分则是打印逻辑,打印100以内的结果。这个例子体现了generator的使用,也体现了它对无限序列的支持。
模块的灵活性和自解释能力。这也是我相当喜欢的一个特性。在Python中有这样的规约,一个下划线开头表示私有变量,两个下划线开头表示Python自身预定义的一些变量,这样的规约即保留了违背规约访问和使用这些变量的灵活性,也提供了很多预定义变量的可能。其中一个是模块的__init__.py,类似于Java的package.java,但是提供了更多的特性,用以模块的自解释,比如标准注释、依赖、编码、文档注释和立即执行的main方法等等。
而实际开发的时候,借助pip和virtualenv,可以说依赖和环境准备比多数语言都简单多了。
最后是decorator,这个其实最早我实在Groovy中见到的,现在很多语言都支持注解,但是原生来看似乎Python是使用它支持特性最丰富的,这里不展开了。
不过,Python代码容易产生的问题不可谓不少。老实说,随着代码规模的增加,我更倾向于一个约束更强,类型系统严谨并且代码代码模板清楚统一的编程语言。Python有些“太过灵活”,无论是易读性还是分层/模块化,我都看到代码中有很多需要改善的地方。最常见的一个模式是,用Python写一堆有关联的类和方法,放在一个py文件里面,在开始的时候很不错,也避免了过度臃肿的类文件,但是很快,随着代码规模的增加,这个文件需要不断被拆分和重构,但是重构这件事情却不是那么容易推动的。程序员都知道,当我们说“未来再扩展”或者“以后再改进”的时候,这件事情多半是不会发生了——于是代码过度耦合就变成了一个问题。以往使用Java写代码的时候,项目组仿佛有约定俗成的理念,无论是分层还是类文件设计,往往在开始的时候都显得有些“过度”,多层次的包、类设计,看起来似乎有些臃肿,但是随着代码规模的增加,好处就体现出来了,代码的单一职责这一要求维护得明显更好,在做某些修改的时候,需要评估的调查范围就小,代码修改也更清楚和易于评审者理解,修改者心里也更有谱。

Labels

Review (572) System Design (334) System Design - Review (198) Java (189) Coding (75) Interview-System Design (65) Interview (63) Book Notes (59) Coding - Review (59) to-do (45) Linux (43) Knowledge (39) Interview-Java (35) Knowledge - Review (32) Database (31) Design Patterns (31) Big Data (29) Product Architecture (28) MultiThread (27) Soft Skills (27) Concurrency (26) Cracking Code Interview (26) Miscs (25) Distributed (24) OOD Design (24) Google (23) Career (22) Interview - Review (21) Java - Code (21) Operating System (21) Interview Q&A (20) System Design - Practice (20) Tips (19) Algorithm (17) Company - Facebook (17) Security (17) How to Ace Interview (16) Brain Teaser (14) Linux - Shell (14) Redis (14) Testing (14) Tools (14) Code Quality (13) Search (13) Spark (13) Spring (13) Company - LinkedIn (12) How to (12) Interview-Database (12) Interview-Operating System (12) Solr (12) Architecture Principles (11) Resource (10) Amazon (9) Cache (9) Git (9) Interview - MultiThread (9) Scalability (9) Trouble Shooting (9) Web Dev (9) Architecture Model (8) Better Programmer (8) Cassandra (8) Company - Uber (8) Java67 (8) Math (8) OO Design principles (8) SOLID (8) Design (7) Interview Corner (7) JVM (7) Java Basics (7) Kafka (7) Mac (7) Machine Learning (7) NoSQL (7) C++ (6) Chrome (6) File System (6) Highscalability (6) How to Better (6) Network (6) Restful (6) CareerCup (5) Code Review (5) Hash (5) How to Interview (5) JDK Source Code (5) JavaScript (5) Leetcode (5) Must Known (5) Python (5)

Popular Posts