From 2ae89e20bc4c61052f122e572e42d48830d4d075 Mon Sep 17 00:00:00 2001 From: Geoff Liu Date: Fri, 24 Oct 2014 00:48:59 -0400 Subject: [PATCH 01/11] Add Python3 simplified Chinese version. --- zh-cn/python3-cn.html.markdown | 648 +++++++++++++++++++++++++++++++++ 1 file changed, 648 insertions(+) create mode 100644 zh-cn/python3-cn.html.markdown diff --git a/zh-cn/python3-cn.html.markdown b/zh-cn/python3-cn.html.markdown new file mode 100644 index 00000000..dc09de4f --- /dev/null +++ b/zh-cn/python3-cn.html.markdown @@ -0,0 +1,648 @@ +--- +language: python3 +contributors: + - ["Louie Dinh", "http://pythonpracticeprojects.com"] + - ["Steven Basart", "http://github.com/xksteven"] + - ["Andre Polykanine", "https://github.com/Oire"] +translators: + - ["Geoff Liu", "http://geoffliu.me"] +filename: learnpython3.py +--- + +Python was created by Guido Van Rossum in the early 90's. It is now one of the most popular +languages in existence. I fell in love with Python for its syntactic clarity. It's basically +executable pseudocode. + +Feedback would be highly appreciated! You can reach me at [@louiedinh](http://twitter.com/louiedinh) or louiedinh [at] [google's email service] + +Note: This article applies to Python 3 specifically. Check out the other tutorial if you want to learn the old Python 2.7 + +```python + +# 用井字符开头的是单行注释 + +""" 多行字符串用三个引号 + 包裹,也常被用来做多 + 行注释 +""" + +#################################################### +## 1. 原始数据类型和运算符 +#################################################### + +# 整数 +3 # => 3 + +# 算术没有什么出乎意料的 +1 + 1 # => 2 +8 - 1 # => 7 +10 * 2 # => 20 + +# 但是除法例外,会自动转换成浮点数 +35 / 5 # => 7.0 +5 / 3 # => 1.6666666666666667 + +# Result of integer division truncated down both for positive and negative. +5 // 3 # => 1 +5.0 // 3.0 # => 1.0 # works on floats too +-5 // 3 # => -2 +-5.0 // 3.0 # => -2.0 + +# 浮点数的运算结果也是浮点数 +3 * 2.0 # => 6.0 + +# Modulo operation +7 % 3 # => 1 + +# x的y次方 +2**4 # => 16 + +# 用括号决定优先级 +(1 + 3) * 2 # => 8 + +# 布尔值 +True +False + +# 用not取非 +not True # => False +not False # => True + +# 逻辑运算符,注意and和or都是小写 +True and False #=> False +False or True #=> True + +# 整数也可以是布尔值 +0 and 2 #=> 0 +-5 or 0 #=> -5 +0 == False #=> True +2 == True #=> False +1 == True #=> True + +# 用==判断相等 +1 == 1 # => True +2 == 1 # => False + +# 用!=判断不等 +1 != 1 # => False +2 != 1 # => True + +# 比较大小 +1 < 10 # => True +1 > 10 # => False +2 <= 2 # => True +2 >= 2 # => True + +# 大小比较可以连起来! +1 < 2 < 3 # => True +2 < 3 < 2 # => False + +# 字符串用单引双引都可以 +"这是个字符串" +'这也是个字符串' + +# 用加好连接字符串 +"Hello " + "world!" # => "Hello world!" + +# A string can be treated like a list of characters +"This is a string"[0] # => 'T' + +# .format can be used to format strings, like this: +"{} can be {}".format("strings", "interpolated") + +# You can repeat the formatting arguments to save some typing. +"{0} be nimble, {0} be quick, {0} jump over the {1}".format("Jack", "candle stick") +#=> "Jack be nimble, Jack be quick, Jack jump over the candle stick" + +# You can use keywords if you don't want to count. +"{name} wants to eat {food}".format(name="Bob", food="lasagna") #=> "Bob wants to eat lasagna" + +# If your Python 3 code also needs to run on Python 2.5 and below, you can also +# still use the old style of formatting: +"%s can be %s the %s way" % ("strings", "interpolated", "old") + + +# None is an object +None # => None + +# Don't use the equality "==" symbol to compare objects to None +# Use "is" instead. This checks for equality of object identity. +"etc" is None # => False +None is None # => True + +# None, 0, and empty strings/lists/dicts all evaluate to False. +# All other values are True +bool(0) # => False +bool("") # => False +bool([]) #=> False +bool({}) #=> False + + +#################################################### +## 2. Variables and Collections +#################################################### + +# Python has a print function +print("I'm Python. Nice to meet you!") + +# No need to declare variables before assigning to them. +# Convention is to use lower_case_with_underscores +some_var = 5 +some_var # => 5 + +# Accessing a previously unassigned variable is an exception. +# See Control Flow to learn more about exception handling. +some_unknown_var # Raises a NameError + +# Lists store sequences +li = [] +# You can start with a prefilled list +other_li = [4, 5, 6] + +# Add stuff to the end of a list with append +li.append(1) # li is now [1] +li.append(2) # li is now [1, 2] +li.append(4) # li is now [1, 2, 4] +li.append(3) # li is now [1, 2, 4, 3] +# Remove from the end with pop +li.pop() # => 3 and li is now [1, 2, 4] +# Let's put it back +li.append(3) # li is now [1, 2, 4, 3] again. + +# Access a list like you would any array +li[0] # => 1 +# Look at the last element +li[-1] # => 3 + +# Looking out of bounds is an IndexError +li[4] # Raises an IndexError + +# You can look at ranges with slice syntax. +# (It's a closed/open range for you mathy types.) +li[1:3] # => [2, 4] +# Omit the beginning +li[2:] # => [4, 3] +# Omit the end +li[:3] # => [1, 2, 4] +# Select every second entry +li[::2] # =>[1, 4] +# Revert the list +li[::-1] # => [3, 4, 2, 1] +# Use any combination of these to make advanced slices +# li[start:end:step] + +# Remove arbitrary elements from a list with "del" +del li[2] # li is now [1, 2, 3] + +# You can add lists +# Note: values for li and for other_li are not modified. +li + other_li # => [1, 2, 3, 4, 5, 6] + +# Concatenate lists with "extend()" +li.extend(other_li) # Now li is [1, 2, 3, 4, 5, 6] + +# Check for existence in a list with "in" +1 in li # => True + +# Examine the length with "len()" +len(li) # => 6 + + +# Tuples are like lists but are immutable. +tup = (1, 2, 3) +tup[0] # => 1 +tup[0] = 3 # Raises a TypeError + +# You can do all those list thingies on tuples too +len(tup) # => 3 +tup + (4, 5, 6) # => (1, 2, 3, 4, 5, 6) +tup[:2] # => (1, 2) +2 in tup # => True + +# You can unpack tuples (or lists) into variables +a, b, c = (1, 2, 3) # a is now 1, b is now 2 and c is now 3 +# Tuples are created by default if you leave out the parentheses +d, e, f = 4, 5, 6 +# Now look how easy it is to swap two values +e, d = d, e # d is now 5 and e is now 4 + + +# Dictionaries store mappings +empty_dict = {} +# Here is a prefilled dictionary +filled_dict = {"one": 1, "two": 2, "three": 3} + +# Look up values with [] +filled_dict["one"] # => 1 + +# Get all keys as a list with "keys()". +# We need to wrap the call in list() because we are getting back an iterable. We'll talk about those later. +# Note - Dictionary key ordering is not guaranteed. +# Your results might not match this exactly. +list(filled_dict.keys()) # => ["three", "two", "one"] + + +# Get all values as a list with "values()". Once again we need to wrap it in list() to get it out of the iterable. +# Note - Same as above regarding key ordering. +list(filled_dict.values()) # => [3, 2, 1] + + +# Check for existence of keys in a dictionary with "in" +"one" in filled_dict # => True +1 in filled_dict # => False + +# Looking up a non-existing key is a KeyError +filled_dict["four"] # KeyError + +# Use "get()" method to avoid the KeyError +filled_dict.get("one") # => 1 +filled_dict.get("four") # => None +# The get method supports a default argument when the value is missing +filled_dict.get("one", 4) # => 1 +filled_dict.get("four", 4) # => 4 + +# "setdefault()" inserts into a dictionary only if the given key isn't present +filled_dict.setdefault("five", 5) # filled_dict["five"] is set to 5 +filled_dict.setdefault("five", 6) # filled_dict["five"] is still 5 + +# Adding to a dictionary +filled_dict.update({"four":4}) #=> {"one": 1, "two": 2, "three": 3, "four": 4} +#filled_dict["four"] = 4 #another way to add to dict + +# Remove keys from a dictionary with del +del filled_dict["one"] # Removes the key "one" from filled dict + + +# Sets store ... well sets +empty_set = set() +# Initialize a set with a bunch of values. Yeah, it looks a bit like a dict. Sorry. +some_set = {1, 1, 2, 2, 3, 4} # some_set is now {1, 2, 3, 4} + +#Can set new variables to a set +filled_set = some_set + +# Add one more item to the set +filled_set.add(5) # filled_set is now {1, 2, 3, 4, 5} + +# Do set intersection with & +other_set = {3, 4, 5, 6} +filled_set & other_set # => {3, 4, 5} + +# Do set union with | +filled_set | other_set # => {1, 2, 3, 4, 5, 6} + +# Do set difference with - +{1, 2, 3, 4} - {2, 3, 5} # => {1, 4} + +# Check for existence in a set with in +2 in filled_set # => True +10 in filled_set # => False + + +#################################################### +## 3. Control Flow and Iterables +#################################################### + +# Let's just make a variable +some_var = 5 + +# Here is an if statement. Indentation is significant in python! +# prints "some_var is smaller than 10" +if some_var > 10: + print("some_var is totally bigger than 10.") +elif some_var < 10: # This elif clause is optional. + print("some_var is smaller than 10.") +else: # This is optional too. + print("some_var is indeed 10.") + + +""" +For loops iterate over lists +prints: + dog is a mammal + cat is a mammal + mouse is a mammal +""" +for animal in ["dog", "cat", "mouse"]: + # You can use format() to interpolate formatted strings + print("{} is a mammal".format(animal)) + +""" +"range(number)" returns a list of numbers +from zero to the given number +prints: + 0 + 1 + 2 + 3 +""" +for i in range(4): + print(i) + +""" +While loops go until a condition is no longer met. +prints: + 0 + 1 + 2 + 3 +""" +x = 0 +while x < 4: + print(x) + x += 1 # Shorthand for x = x + 1 + +# Handle exceptions with a try/except block +try: + # Use "raise" to raise an error + raise IndexError("This is an index error") +except IndexError as e: + pass # Pass is just a no-op. Usually you would do recovery here. +except (TypeError, NameError): + pass # Multiple exceptions can be handled together, if required. +else: # Optional clause to the try/except block. Must follow all except blocks + print("All good!") # Runs only if the code in try raises no exceptions + +# Python offers a fundamental abstraction called the Iterable. +# An iterable is an object that can be treated as a sequence. +# The object returned the range function, is an iterable. + +filled_dict = {"one": 1, "two": 2, "three": 3} +our_iterable = filled_dict.keys() +print(our_iterable) #=> range(1,10). This is an object that implements our Iterable interface + +# We can loop over it. +for i in our_iterable: + print(i) # Prints one, two, three + +# However we cannot address elements by index. +our_iterable[1] # Raises a TypeError + +# An iterable is an object that knows how to create an iterator. +our_iterator = iter(our_iterable) + +# Our iterator is an object that can remember the state as we traverse through it. +# We get the next object by calling the __next__ function. +our_iterator.__next__() #=> "one" + +# It maintains state as we call __next__. +our_iterator.__next__() #=> "two" +our_iterator.__next__() #=> "three" + +# After the iterator has returned all of its data, it gives you a StopIterator Exception +our_iterator.__next__() # Raises StopIteration + +# You can grab all the elements of an iterator by calling list() on it. +list(filled_dict.keys()) #=> Returns ["one", "two", "three"] + + + +#################################################### +## 4. Functions +#################################################### + +# Use "def" to create new functions +def add(x, y): + print("x is {} and y is {}".format(x, y)) + return x + y # Return values with a return statement + +# Calling functions with parameters +add(5, 6) # => prints out "x is 5 and y is 6" and returns 11 + +# Another way to call functions is with keyword arguments +add(y=6, x=5) # Keyword arguments can arrive in any order. + + +# You can define functions that take a variable number of +# positional arguments +def varargs(*args): + return args + +varargs(1, 2, 3) # => (1, 2, 3) + + +# You can define functions that take a variable number of +# keyword arguments, as well +def keyword_args(**kwargs): + return kwargs + +# Let's call it to see what happens +keyword_args(big="foot", loch="ness") # => {"big": "foot", "loch": "ness"} + + +# You can do both at once, if you like +def all_the_args(*args, **kwargs): + print(args) + print(kwargs) +""" +all_the_args(1, 2, a=3, b=4) prints: + (1, 2) + {"a": 3, "b": 4} +""" + +# When calling functions, you can do the opposite of args/kwargs! +# Use * to expand tuples and use ** to expand kwargs. +args = (1, 2, 3, 4) +kwargs = {"a": 3, "b": 4} +all_the_args(*args) # equivalent to foo(1, 2, 3, 4) +all_the_args(**kwargs) # equivalent to foo(a=3, b=4) +all_the_args(*args, **kwargs) # equivalent to foo(1, 2, 3, 4, a=3, b=4) + + +# Function Scope +x = 5 + +def setX(num): + # Local var x not the same as global variable x + x = num # => 43 + print (x) # => 43 + +def setGlobalX(num): + global x + print (x) # => 5 + x = num # global var x is now set to 6 + print (x) # => 6 + +setX(43) +setGlobalX(6) + + +# Python has first class functions +def create_adder(x): + def adder(y): + return x + y + return adder + +add_10 = create_adder(10) +add_10(3) # => 13 + +# There are also anonymous functions +(lambda x: x > 2)(3) # => True + +# TODO - Fix for iterables +# There are built-in higher order functions +map(add_10, [1, 2, 3]) # => [11, 12, 13] +filter(lambda x: x > 5, [3, 4, 5, 6, 7]) # => [6, 7] + +# We can use list comprehensions for nice maps and filters +# List comprehension stores the output as a list which can itself be a nested list +[add_10(i) for i in [1, 2, 3]] # => [11, 12, 13] +[x for x in [3, 4, 5, 6, 7] if x > 5] # => [6, 7] + +#################################################### +## 5. Classes +#################################################### + + +# We subclass from object to get a class. +class Human(object): + + # A class attribute. It is shared by all instances of this class + species = "H. sapiens" + + # Basic initializer, this is called when this class is instantiated. + # Note that the double leading and trailing underscores denote objects + # or attributes that are used by python but that live in user-controlled + # namespaces. You should not invent such names on your own. + def __init__(self, name): + # Assign the argument to the instance's name attribute + self.name = name + + # An instance method. All methods take "self" as the first argument + def say(self, msg): + return "{name}: {message}".format(name=self.name, message=msg) + + # A class method is shared among all instances + # They are called with the calling class as the first argument + @classmethod + def get_species(cls): + return cls.species + + # A static method is called without a class or instance reference + @staticmethod + def grunt(): + return "*grunt*" + + +# Instantiate a class +i = Human(name="Ian") +print(i.say("hi")) # prints out "Ian: hi" + +j = Human("Joel") +print(j.say("hello")) # prints out "Joel: hello" + +# Call our class method +i.get_species() # => "H. sapiens" + +# Change the shared attribute +Human.species = "H. neanderthalensis" +i.get_species() # => "H. neanderthalensis" +j.get_species() # => "H. neanderthalensis" + +# Call the static method +Human.grunt() # => "*grunt*" + + +#################################################### +## 6. Modules +#################################################### + +# You can import modules +import math +print(math.sqrt(16)) # => 4 + +# You can get specific functions from a module +from math import ceil, floor +print(ceil(3.7)) # => 4.0 +print(floor(3.7)) # => 3.0 + +# You can import all functions from a module. +# Warning: this is not recommended +from math import * + +# You can shorten module names +import math as m +math.sqrt(16) == m.sqrt(16) # => True + +# Python modules are just ordinary python files. You +# can write your own, and import them. The name of the +# module is the same as the name of the file. + +# You can find out which functions and attributes +# defines a module. +import math +dir(math) + + +#################################################### +## 7. Advanced +#################################################### + +# Generators help you make lazy code +def double_numbers(iterable): + for i in iterable: + yield i + i + +# A generator creates values on the fly. +# Instead of generating and returning all values at once it creates one in each +# iteration. This means values bigger than 15 wont be processed in +# double_numbers. +# Note range is a generator too. Creating a list 1-900000000 would take lot of +# time to be made +# We use a trailing underscore in variable names when we want to use a name that +# would normally collide with a python keyword +range_ = range(1, 900000000) +# will double all numbers until a result >=30 found +for i in double_numbers(range_): + print(i) + if i >= 30: + break + + +# Decorators +# in this example beg wraps say +# Beg will call say. If say_please is True then it will change the returned +# message +from functools import wraps + + +def beg(target_function): + @wraps(target_function) + def wrapper(*args, **kwargs): + msg, say_please = target_function(*args, **kwargs) + if say_please: + return "{} {}".format(msg, "Please! I am poor :(") + return msg + + return wrapper + + +@beg +def say(say_please=False): + msg = "Can you buy me a beer?" + return msg, say_please + + +print(say()) # Can you buy me a beer? +print(say(say_please=True)) # Can you buy me a beer? Please! I am poor :( +``` + +## Ready For More? + +### Free Online + +* [Learn Python The Hard Way](http://learnpythonthehardway.org/book/) +* [Dive Into Python](http://www.diveintopython.net/) +* [Ideas for Python Projects](http://pythonpracticeprojects.com) + +* [The Official Docs](http://docs.python.org/3/) +* [Hitchhiker's Guide to Python](http://docs.python-guide.org/en/latest/) +* [Python Module of the Week](http://pymotw.com/3/) +* [A Crash Course in Python for Scientists](http://nbviewer.ipython.org/5920182) + +### Dead Tree + +* [Programming Python](http://www.amazon.com/gp/product/0596158106/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596158106&linkCode=as2&tag=homebits04-20) +* [Dive Into Python](http://www.amazon.com/gp/product/1441413022/ref=as_li_tf_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1441413022&linkCode=as2&tag=homebits04-20) +* [Python Essential Reference](http://www.amazon.com/gp/product/0672329786/ref=as_li_tf_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0672329786&linkCode=as2&tag=homebits04-20) + From d7d131f4406ac86c50b563797c4432dc79e244ec Mon Sep 17 00:00:00 2001 From: Geoff Liu Date: Fri, 24 Oct 2014 01:05:33 -0400 Subject: [PATCH 02/11] Fix a typo, plus section headings --- zh-cn/python3-cn.html.markdown | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/zh-cn/python3-cn.html.markdown b/zh-cn/python3-cn.html.markdown index dc09de4f..74e997ec 100644 --- a/zh-cn/python3-cn.html.markdown +++ b/zh-cn/python3-cn.html.markdown @@ -51,7 +51,7 @@ Note: This article applies to Python 3 specifically. Check out the other tutoria # 浮点数的运算结果也是浮点数 3 * 2.0 # => 6.0 -# Modulo operation +# 模除 7 % 3 # => 1 # x的y次方 @@ -72,7 +72,7 @@ not False # => True True and False #=> False False or True #=> True -# 整数也可以是布尔值 +# 整数也可以当作布尔值 0 and 2 #=> 0 -5 or 0 #=> -5 0 == False #=> True @@ -101,10 +101,10 @@ False or True #=> True "这是个字符串" '这也是个字符串' -# 用加好连接字符串 +# 用加号连接字符串 "Hello " + "world!" # => "Hello world!" -# A string can be treated like a list of characters +# 字符串可以被当作字符列表 "This is a string"[0] # => 'T' # .format can be used to format strings, like this: @@ -139,7 +139,7 @@ bool({}) #=> False #################################################### -## 2. Variables and Collections +## 2. 变量和集合 #################################################### # Python has a print function @@ -300,7 +300,7 @@ filled_set | other_set # => {1, 2, 3, 4, 5, 6} #################################################### -## 3. Control Flow and Iterables +## 3. 流程控制和迭代器 #################################################### # Let's just make a variable @@ -398,7 +398,7 @@ list(filled_dict.keys()) #=> Returns ["one", "two", "three"] #################################################### -## 4. Functions +## 4. 函数 #################################################### # Use "def" to create new functions @@ -490,7 +490,7 @@ filter(lambda x: x > 5, [3, 4, 5, 6, 7]) # => [6, 7] [x for x in [3, 4, 5, 6, 7] if x > 5] # => [6, 7] #################################################### -## 5. Classes +## 5. 类 #################################################### @@ -544,7 +544,7 @@ Human.grunt() # => "*grunt*" #################################################### -## 6. Modules +## 6. 模块 #################################################### # You can import modules @@ -575,7 +575,7 @@ dir(math) #################################################### -## 7. Advanced +## 7. 高级用法 #################################################### # Generators help you make lazy code From c917dc75ac25641b86ecd2d14928175c3d1cc684 Mon Sep 17 00:00:00 2001 From: Geoff Liu Date: Fri, 24 Oct 2014 11:24:51 -0400 Subject: [PATCH 03/11] Finish most lines in section 1 --- zh-cn/python3-cn.html.markdown | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/zh-cn/python3-cn.html.markdown b/zh-cn/python3-cn.html.markdown index 74e997ec..e297a7ce 100644 --- a/zh-cn/python3-cn.html.markdown +++ b/zh-cn/python3-cn.html.markdown @@ -42,9 +42,9 @@ Note: This article applies to Python 3 specifically. Check out the other tutoria 35 / 5 # => 7.0 5 / 3 # => 1.6666666666666667 -# Result of integer division truncated down both for positive and negative. +# 整数除法的结果都是向下取整 5 // 3 # => 1 -5.0 // 3.0 # => 1.0 # works on floats too +5.0 // 3.0 # => 1.0 # 浮点数也可以 -5 // 3 # => -2 -5.0 // 3.0 # => -2.0 @@ -107,22 +107,20 @@ False or True #=> True # 字符串可以被当作字符列表 "This is a string"[0] # => 'T' -# .format can be used to format strings, like this: +# 用.format来格式化字符串 "{} can be {}".format("strings", "interpolated") -# You can repeat the formatting arguments to save some typing. +# 可以重复参数以节省时间 "{0} be nimble, {0} be quick, {0} jump over the {1}".format("Jack", "candle stick") #=> "Jack be nimble, Jack be quick, Jack jump over the candle stick" -# You can use keywords if you don't want to count. +# 如果不想数参数,可以用关键字 "{name} wants to eat {food}".format(name="Bob", food="lasagna") #=> "Bob wants to eat lasagna" -# If your Python 3 code also needs to run on Python 2.5 and below, you can also -# still use the old style of formatting: +# 如果你的Python3程序也要在Python2.5以下环境运行,也可以用老式的格式化语法 "%s can be %s the %s way" % ("strings", "interpolated", "old") - -# None is an object +# None是一个对象 None # => None # Don't use the equality "==" symbol to compare objects to None @@ -130,8 +128,8 @@ None # => None "etc" is None # => False None is None # => True -# None, 0, and empty strings/lists/dicts all evaluate to False. -# All other values are True +# None,0,空字符串,空列表,空关联数组都算是False +# 所有其他值都是True bool(0) # => False bool("") # => False bool([]) #=> False From ba5c351f216ca63e4f46230db683224fd6d26355 Mon Sep 17 00:00:00 2001 From: Geoff Liu Date: Fri, 31 Oct 2014 15:40:49 -0600 Subject: [PATCH 04/11] A bit of section 2, 3, 4 --- zh-cn/python3-cn.html.markdown | 88 +++++++++++++++++----------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/zh-cn/python3-cn.html.markdown b/zh-cn/python3-cn.html.markdown index e297a7ce..78ecb4af 100644 --- a/zh-cn/python3-cn.html.markdown +++ b/zh-cn/python3-cn.html.markdown @@ -140,60 +140,60 @@ bool({}) #=> False ## 2. 变量和集合 #################################################### -# Python has a print function +# print是内置的打印函数 print("I'm Python. Nice to meet you!") -# No need to declare variables before assigning to them. -# Convention is to use lower_case_with_underscores +# 在给变量赋值前不用提前声明 +# 传统的变量命名是小写,用下划线分隔单词 some_var = 5 some_var # => 5 -# Accessing a previously unassigned variable is an exception. -# See Control Flow to learn more about exception handling. -some_unknown_var # Raises a NameError +# 存取未赋值的变量会抛出异常 +# 下面流程控制一段更深入讲解异常处理 +some_unknown_var # 抛出NameError -# Lists store sequences +# 用列表(list)储存序列 li = [] -# You can start with a prefilled list +# 创建列表时也可以同时赋给元素 other_li = [4, 5, 6] -# Add stuff to the end of a list with append -li.append(1) # li is now [1] -li.append(2) # li is now [1, 2] -li.append(4) # li is now [1, 2, 4] -li.append(3) # li is now [1, 2, 4, 3] -# Remove from the end with pop -li.pop() # => 3 and li is now [1, 2, 4] -# Let's put it back -li.append(3) # li is now [1, 2, 4, 3] again. +# 用append在列表最后追加元素 +li.append(1) # li现在是[1] +li.append(2) # li现在是[1, 2] +li.append(4) # li现在是[1, 2, 4] +li.append(3) # li现在是[1, 2, 4, 3] +# 用pop从列表尾部删除 +li.pop() # => 3 且li现在是[1, 2, 4] +# 把3再放回去 +li.append(3) # li变回[1, 2, 4, 3] -# Access a list like you would any array +# 列表取值跟数组一样 li[0] # => 1 -# Look at the last element +# 取出最后一个元素 li[-1] # => 3 -# Looking out of bounds is an IndexError -li[4] # Raises an IndexError +# 越界读取会造成IndexError +li[4] # 抛出IndexError -# You can look at ranges with slice syntax. +# 列表的切割语法 # (It's a closed/open range for you mathy types.) li[1:3] # => [2, 4] -# Omit the beginning +# 取尾 li[2:] # => [4, 3] -# Omit the end +# 取头 li[:3] # => [1, 2, 4] -# Select every second entry +# 每两个取一个 li[::2] # =>[1, 4] -# Revert the list +# 倒排列表 li[::-1] # => [3, 4, 2, 1] # Use any combination of these to make advanced slices # li[start:end:step] -# Remove arbitrary elements from a list with "del" +# 用del删除任何一个元素 del li[2] # li is now [1, 2, 3] -# You can add lists -# Note: values for li and for other_li are not modified. +# 列表可以相加 +# 注意:li和other_li的值都不变 li + other_li # => [1, 2, 3, 4, 5, 6] # Concatenate lists with "extend()" @@ -211,7 +211,7 @@ tup = (1, 2, 3) tup[0] # => 1 tup[0] = 3 # Raises a TypeError -# You can do all those list thingies on tuples too +# 列表允许的操作元组也可以 len(tup) # => 3 tup + (4, 5, 6) # => (1, 2, 3, 4, 5, 6) tup[:2] # => (1, 2) @@ -301,17 +301,17 @@ filled_set | other_set # => {1, 2, 3, 4, 5, 6} ## 3. 流程控制和迭代器 #################################################### -# Let's just make a variable +# 先随便定义一个变量 some_var = 5 -# Here is an if statement. Indentation is significant in python! -# prints "some_var is smaller than 10" +# 这是个if语句。注意缩进在Python里是有意义的 +# 印出"some_var比10小" if some_var > 10: - print("some_var is totally bigger than 10.") -elif some_var < 10: # This elif clause is optional. - print("some_var is smaller than 10.") -else: # This is optional too. - print("some_var is indeed 10.") + print("some_var比10大") +elif some_var < 10: # elif句是可选的 + print("some_var比10小") +else: # else也是可选的 + print("some_var就是10") """ @@ -399,16 +399,16 @@ list(filled_dict.keys()) #=> Returns ["one", "two", "three"] ## 4. 函数 #################################################### -# Use "def" to create new functions +# 用def定义新函数 def add(x, y): print("x is {} and y is {}".format(x, y)) - return x + y # Return values with a return statement + return x + y # 用return语句返回 -# Calling functions with parameters -add(5, 6) # => prints out "x is 5 and y is 6" and returns 11 +# 调用函数 +add(5, 6) # => 印出"x is 5 and y is 6"并且返回11 -# Another way to call functions is with keyword arguments -add(y=6, x=5) # Keyword arguments can arrive in any order. +# 也可以用关键字参数来调用函数 +add(y=6, x=5) # 关键字参数可以用任何顺序 # You can define functions that take a variable number of From 2444690e5fae22d5f09f3f4966996785353fd3af Mon Sep 17 00:00:00 2001 From: Geoff Liu Date: Fri, 31 Oct 2014 15:52:20 -0600 Subject: [PATCH 05/11] All of section 6 --- zh-cn/python3-cn.html.markdown | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/zh-cn/python3-cn.html.markdown b/zh-cn/python3-cn.html.markdown index 78ecb4af..efdfc158 100644 --- a/zh-cn/python3-cn.html.markdown +++ b/zh-cn/python3-cn.html.markdown @@ -545,29 +545,27 @@ Human.grunt() # => "*grunt*" ## 6. 模块 #################################################### -# You can import modules +# 用import导入模块 import math print(math.sqrt(16)) # => 4 -# You can get specific functions from a module +# 也可以从模块中导入个别值 from math import ceil, floor print(ceil(3.7)) # => 4.0 print(floor(3.7)) # => 3.0 -# You can import all functions from a module. -# Warning: this is not recommended +# 可以导入一个模块中所有值 +# 警告:不建议这么做 from math import * -# You can shorten module names +# 如此缩写模块名字 import math as m math.sqrt(16) == m.sqrt(16) # => True -# Python modules are just ordinary python files. You -# can write your own, and import them. The name of the -# module is the same as the name of the file. +# Python模块其实就是普通的Python文件。你可以自己写,然后导入, +# 模块的名字就是文件的名字。 -# You can find out which functions and attributes -# defines a module. +# 你可以这样列出一个模块里所有的值 import math dir(math) From fb89673ef1063c3446462d3249246929d492ea76 Mon Sep 17 00:00:00 2001 From: Geoff Liu Date: Fri, 31 Oct 2014 16:01:10 -0600 Subject: [PATCH 06/11] Minor changes --- zh-cn/python3-cn.html.markdown | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/zh-cn/python3-cn.html.markdown b/zh-cn/python3-cn.html.markdown index efdfc158..6ad23600 100644 --- a/zh-cn/python3-cn.html.markdown +++ b/zh-cn/python3-cn.html.markdown @@ -148,8 +148,8 @@ print("I'm Python. Nice to meet you!") some_var = 5 some_var # => 5 -# 存取未赋值的变量会抛出异常 -# 下面流程控制一段更深入讲解异常处理 +# 访问未赋值的变量会抛出异常 +# 参考流程控制一段来学习异常处理 some_unknown_var # 抛出NameError # 用列表(list)储存序列 @@ -167,22 +167,22 @@ li.pop() # => 3 且li现在是[1, 2, 4] # 把3再放回去 li.append(3) # li变回[1, 2, 4, 3] -# 列表取值跟数组一样 +# 列表存取跟数组一样 li[0] # => 1 # 取出最后一个元素 li[-1] # => 3 -# 越界读取会造成IndexError +# 越界存取会造成IndexError li[4] # 抛出IndexError -# 列表的切割语法 +# 列表有切割语法 # (It's a closed/open range for you mathy types.) li[1:3] # => [2, 4] # 取尾 li[2:] # => [4, 3] # 取头 li[:3] # => [1, 2, 4] -# 每两个取一个 +# 隔一个取一个 li[::2] # =>[1, 4] # 倒排列表 li[::-1] # => [3, 4, 2, 1] From d234d1c8945a7a4fdc812be65de89ca0c6aa52b6 Mon Sep 17 00:00:00 2001 From: Geoff Liu Date: Fri, 31 Oct 2014 17:20:50 -0600 Subject: [PATCH 07/11] Finish sections 2 and 3 --- zh-cn/python3-cn.html.markdown | 153 ++++++++++++++++----------------- 1 file changed, 74 insertions(+), 79 deletions(-) diff --git a/zh-cn/python3-cn.html.markdown b/zh-cn/python3-cn.html.markdown index 6ad23600..2c1c03f8 100644 --- a/zh-cn/python3-cn.html.markdown +++ b/zh-cn/python3-cn.html.markdown @@ -9,13 +9,13 @@ translators: filename: learnpython3.py --- -Python was created by Guido Van Rossum in the early 90's. It is now one of the most popular -languages in existence. I fell in love with Python for its syntactic clarity. It's basically -executable pseudocode. +Python是由吉多·范罗苏姆(Guido Van Rossum)在90年代早期设计。它是如今最常用的编程 +语言之一。它的语法简洁且优美,几乎就是可执行的伪代码。 -Feedback would be highly appreciated! You can reach me at [@louiedinh](http://twitter.com/louiedinh) or louiedinh [at] [google's email service] +欢迎大家斧正。英文版原作Louie Dinh [@louiedinh](http://twitter.com/louiedinh) +或着Email louiedinh [at] [谷歌的信箱服务]。中文翻译Geoff Liu。 -Note: This article applies to Python 3 specifically. Check out the other tutorial if you want to learn the old Python 2.7 +注意:这篇教程是特别为Python3写的。如果你想学旧版Python2,我们特别有另一篇教程。 ```python @@ -128,7 +128,7 @@ None # => None "etc" is None # => False None is None # => True -# None,0,空字符串,空列表,空关联数组都算是False +# None,0,空字符串,空列表,空字典都算是False # 所有其他值都是True bool(0) # => False bool("") # => False @@ -176,7 +176,6 @@ li[-1] # => 3 li[4] # 抛出IndexError # 列表有切割语法 -# (It's a closed/open range for you mathy types.) li[1:3] # => [2, 4] # 取尾 li[2:] # => [4, 3] @@ -196,103 +195,101 @@ del li[2] # li is now [1, 2, 3] # 注意:li和other_li的值都不变 li + other_li # => [1, 2, 3, 4, 5, 6] -# Concatenate lists with "extend()" -li.extend(other_li) # Now li is [1, 2, 3, 4, 5, 6] +# 用extend拼接列表 +li.extend(other_li) # li现在是[1, 2, 3, 4, 5, 6] -# Check for existence in a list with "in" +# 用in测试列表是否包含值 1 in li # => True -# Examine the length with "len()" +# 用len取列表长度 len(li) # => 6 -# Tuples are like lists but are immutable. +# 元组是不可改变的序列 tup = (1, 2, 3) tup[0] # => 1 -tup[0] = 3 # Raises a TypeError +tup[0] = 3 # 抛出TypeError -# 列表允许的操作元组也可以 +# 列表允许的操作元组大都可以 len(tup) # => 3 tup + (4, 5, 6) # => (1, 2, 3, 4, 5, 6) tup[:2] # => (1, 2) 2 in tup # => True -# You can unpack tuples (or lists) into variables -a, b, c = (1, 2, 3) # a is now 1, b is now 2 and c is now 3 -# Tuples are created by default if you leave out the parentheses +# 可以把元组合列表解包,赋值给变量 +a, b, c = (1, 2, 3) # 现在a是1,b是2,c是3 +# 元组周围的括号是可以省略的 d, e, f = 4, 5, 6 -# Now look how easy it is to swap two values -e, d = d, e # d is now 5 and e is now 4 +# 交换两个变量的值就这么简单 +e, d = d, e # 现在d是5,e是4 -# Dictionaries store mappings +# 用字典表达映射关系 empty_dict = {} -# Here is a prefilled dictionary +# 初始化的字典 filled_dict = {"one": 1, "two": 2, "three": 3} -# Look up values with [] +# 用[]取值 filled_dict["one"] # => 1 -# Get all keys as a list with "keys()". -# We need to wrap the call in list() because we are getting back an iterable. We'll talk about those later. -# Note - Dictionary key ordering is not guaranteed. -# Your results might not match this exactly. + +# 用keys获得所有的键。因为keys返回一个可迭代对象,所以在这里把结果包在list里。我们下面会详细介绍可迭代。 +# 注意:字典键的顺序是不定的,你得到的结果可能和以下不同。 list(filled_dict.keys()) # => ["three", "two", "one"] -# Get all values as a list with "values()". Once again we need to wrap it in list() to get it out of the iterable. -# Note - Same as above regarding key ordering. +# 用values获得所有的值。跟keys一样,要用list包起来,顺序也可能不同。 list(filled_dict.values()) # => [3, 2, 1] -# Check for existence of keys in a dictionary with "in" +# 用in测试一个字典是否包含一个键 "one" in filled_dict # => True 1 in filled_dict # => False -# Looking up a non-existing key is a KeyError +# 访问不存在的键会导致KeyError filled_dict["four"] # KeyError -# Use "get()" method to avoid the KeyError +# 用get来避免KeyError filled_dict.get("one") # => 1 filled_dict.get("four") # => None -# The get method supports a default argument when the value is missing +# 当键不存在的时候get方法可以返回默认值 filled_dict.get("one", 4) # => 1 filled_dict.get("four", 4) # => 4 -# "setdefault()" inserts into a dictionary only if the given key isn't present -filled_dict.setdefault("five", 5) # filled_dict["five"] is set to 5 -filled_dict.setdefault("five", 6) # filled_dict["five"] is still 5 +# setdefault方法只有当键不存在的时候插入新值 +filled_dict.setdefault("five", 5) # filled_dict["five"]设为5 +filled_dict.setdefault("five", 6) # filled_dict["five"]还是5 -# Adding to a dictionary +# 字典赋值 filled_dict.update({"four":4}) #=> {"one": 1, "two": 2, "three": 3, "four": 4} -#filled_dict["four"] = 4 #another way to add to dict +filled_dict["four"] = 4 # 另一种赋值方法 -# Remove keys from a dictionary with del -del filled_dict["one"] # Removes the key "one" from filled dict +# 用del删除 +del filled_dict["one"] # 从filled_dict中把one删除 -# Sets store ... well sets +# 用set表达集合 empty_set = set() -# Initialize a set with a bunch of values. Yeah, it looks a bit like a dict. Sorry. -some_set = {1, 1, 2, 2, 3, 4} # some_set is now {1, 2, 3, 4} +# 初始化一个集合,语法跟字典相似。 +some_set = {1, 1, 2, 2, 3, 4} # some_set现在是{1, 2, 3, 4} -#Can set new variables to a set +# 可以把集合赋值于变量 filled_set = some_set -# Add one more item to the set -filled_set.add(5) # filled_set is now {1, 2, 3, 4, 5} +# 为集合添加元素 +filled_set.add(5) # filled_set现在是{1, 2, 3, 4, 5} -# Do set intersection with & +# & 取交集 other_set = {3, 4, 5, 6} filled_set & other_set # => {3, 4, 5} -# Do set union with | +# | 取并集 filled_set | other_set # => {1, 2, 3, 4, 5, 6} -# Do set difference with - +# - 取补集 {1, 2, 3, 4} - {2, 3, 5} # => {1, 4} -# Check for existence in a set with in +# in 测试集合是否包含元素 2 in filled_set # => True 10 in filled_set # => False @@ -315,20 +312,18 @@ else: # else也是可选的 """ -For loops iterate over lists -prints: +用for循环语句遍历列表 +打印: dog is a mammal cat is a mammal mouse is a mammal """ for animal in ["dog", "cat", "mouse"]: - # You can use format() to interpolate formatted strings print("{} is a mammal".format(animal)) """ -"range(number)" returns a list of numbers -from zero to the given number -prints: +"range(number)"返回数字列表从0到给的数字 +打印: 0 1 2 @@ -338,8 +333,8 @@ for i in range(4): print(i) """ -While loops go until a condition is no longer met. -prints: +while循环直到条件不满足 +打印: 0 1 2 @@ -348,49 +343,49 @@ prints: x = 0 while x < 4: print(x) - x += 1 # Shorthand for x = x + 1 + x += 1 # x = x + 1 的简写 -# Handle exceptions with a try/except block +# try/except块处理异常状况 try: - # Use "raise" to raise an error + # 用raise来抛出异常 raise IndexError("This is an index error") except IndexError as e: - pass # Pass is just a no-op. Usually you would do recovery here. + pass # pass是无操作,但是应该在这里处理错误 except (TypeError, NameError): - pass # Multiple exceptions can be handled together, if required. -else: # Optional clause to the try/except block. Must follow all except blocks - print("All good!") # Runs only if the code in try raises no exceptions + pass # 可以同时处理不同类的错误 +else: # else语句是可选的,必须在所有的except之后 + print("All good!") # 只有当try运行完没有错误的时候这句才会运行 -# Python offers a fundamental abstraction called the Iterable. -# An iterable is an object that can be treated as a sequence. -# The object returned the range function, is an iterable. + +# Python提供一个叫做可迭代(iterable)的基本抽象。一个可迭代对象是可以被当作序列 +# 的对象。比如说上面range返回的对象就是可迭代的。 filled_dict = {"one": 1, "two": 2, "three": 3} our_iterable = filled_dict.keys() -print(our_iterable) #=> range(1,10). This is an object that implements our Iterable interface +print(our_iterable) # => range(1,10) 是一个实现可迭代接口的对象 -# We can loop over it. +# 可迭代对象可以遍历 for i in our_iterable: - print(i) # Prints one, two, three + print(i) # 打印 one, two, three -# However we cannot address elements by index. -our_iterable[1] # Raises a TypeError +# 但是不可以随机访问 +our_iterable[1] # 抛出TypeError -# An iterable is an object that knows how to create an iterator. +# 可迭代对象知道怎么生成迭代器 our_iterator = iter(our_iterable) -# Our iterator is an object that can remember the state as we traverse through it. -# We get the next object by calling the __next__ function. +# 迭代器是一个可以记住遍历的位置的对象 +# 用__next__可以取得下一个元素 our_iterator.__next__() #=> "one" -# It maintains state as we call __next__. +# 再一次调取__next__时会记得位置 our_iterator.__next__() #=> "two" our_iterator.__next__() #=> "three" -# After the iterator has returned all of its data, it gives you a StopIterator Exception -our_iterator.__next__() # Raises StopIteration +# 当迭代器所有元素都取出后,会抛出StopIteration +our_iterator.__next__() # 抛出StopIteration -# You can grab all the elements of an iterator by calling list() on it. +# 可以用list一次取出迭代器所有的元素 list(filled_dict.keys()) #=> Returns ["one", "two", "three"] From ce381ce958b45d5249e597b51703b5ef65247310 Mon Sep 17 00:00:00 2001 From: Geoff Liu Date: Tue, 4 Nov 2014 13:15:57 -0700 Subject: [PATCH 08/11] Functions section --- zh-cn/python3-cn.html.markdown | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/zh-cn/python3-cn.html.markdown b/zh-cn/python3-cn.html.markdown index 2c1c03f8..a490ea40 100644 --- a/zh-cn/python3-cn.html.markdown +++ b/zh-cn/python3-cn.html.markdown @@ -406,24 +406,22 @@ add(5, 6) # => 印出"x is 5 and y is 6"并且返回11 add(y=6, x=5) # 关键字参数可以用任何顺序 -# You can define functions that take a variable number of -# positional arguments +# 我们可以定义一个可变参数函数 def varargs(*args): return args varargs(1, 2, 3) # => (1, 2, 3) -# You can define functions that take a variable number of -# keyword arguments, as well +# 我们也可以定义一个关键字可变参数函数 def keyword_args(**kwargs): return kwargs -# Let's call it to see what happens +# 我们来看看结果是什么: keyword_args(big="foot", loch="ness") # => {"big": "foot", "loch": "ness"} -# You can do both at once, if you like +# 这两种可变参数可以混着用 def all_the_args(*args, **kwargs): print(args) print(kwargs) @@ -433,8 +431,7 @@ all_the_args(1, 2, a=3, b=4) prints: {"a": 3, "b": 4} """ -# When calling functions, you can do the opposite of args/kwargs! -# Use * to expand tuples and use ** to expand kwargs. +# 调用可变参数函数时可以做跟上面相反的,用*展开序列,用**展开字典。 args = (1, 2, 3, 4) kwargs = {"a": 3, "b": 4} all_the_args(*args) # equivalent to foo(1, 2, 3, 4) @@ -442,25 +439,25 @@ all_the_args(**kwargs) # equivalent to foo(a=3, b=4) all_the_args(*args, **kwargs) # equivalent to foo(1, 2, 3, 4, a=3, b=4) -# Function Scope +# 函数作用域 x = 5 def setX(num): - # Local var x not the same as global variable x + # 局部作用域的x和全局域的x是不同的 x = num # => 43 print (x) # => 43 def setGlobalX(num): global x print (x) # => 5 - x = num # global var x is now set to 6 + x = num # 现在全局域的x被赋值 print (x) # => 6 setX(43) setGlobalX(6) -# Python has first class functions +# 函数在Python是一等公民 def create_adder(x): def adder(y): return x + y @@ -469,16 +466,14 @@ def create_adder(x): add_10 = create_adder(10) add_10(3) # => 13 -# There are also anonymous functions +# 也有匿名函数 (lambda x: x > 2)(3) # => True -# TODO - Fix for iterables -# There are built-in higher order functions +# 内置的高阶函数 map(add_10, [1, 2, 3]) # => [11, 12, 13] filter(lambda x: x > 5, [3, 4, 5, 6, 7]) # => [6, 7] -# We can use list comprehensions for nice maps and filters -# List comprehension stores the output as a list which can itself be a nested list +# 用列表推导式可以简化映射和过滤。列表推导式的返回值是另一个列表。 [add_10(i) for i in [1, 2, 3]] # => [11, 12, 13] [x for x in [3, 4, 5, 6, 7] if x > 5] # => [6, 7] From 191a0c705010634fd2b091bce5653da72bbfcf4a Mon Sep 17 00:00:00 2001 From: Geoff Liu Date: Wed, 5 Nov 2014 12:36:28 -0700 Subject: [PATCH 09/11] Only one section left! --- zh-cn/python3-cn.html.markdown | 35 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/zh-cn/python3-cn.html.markdown b/zh-cn/python3-cn.html.markdown index a490ea40..1f294ebb 100644 --- a/zh-cn/python3-cn.html.markdown +++ b/zh-cn/python3-cn.html.markdown @@ -345,9 +345,9 @@ while x < 4: print(x) x += 1 # x = x + 1 的简写 -# try/except块处理异常状况 +# 用try/except块处理异常状况 try: - # 用raise来抛出异常 + # 用raise抛出异常 raise IndexError("This is an index error") except IndexError as e: pass # pass是无操作,但是应该在这里处理错误 @@ -564,31 +564,28 @@ dir(math) ## 7. 高级用法 #################################################### -# Generators help you make lazy code +# 用生成器(generators)方便地写惰性运算 def double_numbers(iterable): for i in iterable: yield i + i -# A generator creates values on the fly. -# Instead of generating and returning all values at once it creates one in each -# iteration. This means values bigger than 15 wont be processed in -# double_numbers. -# Note range is a generator too. Creating a list 1-900000000 would take lot of -# time to be made -# We use a trailing underscore in variable names when we want to use a name that -# would normally collide with a python keyword +# 生成器只有在需要时才计算下一个值。它们每一次循环只生成一个值,而不是把所有的 +# 值全部算好。这意味着double_numbers不会生成大于15的数字。 +# +# range的返回值也是一个生成器,不然一个1到900000000的列表会花很多时间和内存。 +# +# 如果你想用一个Python的关键字当作变量名,可以加一个下划线来区分。 range_ = range(1, 900000000) -# will double all numbers until a result >=30 found +# 当找到一个 >=30 的结果就会停 for i in double_numbers(range_): print(i) if i >= 30: break -# Decorators -# in this example beg wraps say -# Beg will call say. If say_please is True then it will change the returned -# message +# 装饰器(decorators) +# 这个例子中,beg装饰say +# beg会先调用say。如果返回的say_please为真,beg会改变返回的字符串。 from functools import wraps @@ -613,9 +610,9 @@ print(say()) # Can you buy me a beer? print(say(say_please=True)) # Can you buy me a beer? Please! I am poor :( ``` -## Ready For More? +## 想继续学吗? -### Free Online +### 线上免费材料(英文) * [Learn Python The Hard Way](http://learnpythonthehardway.org/book/) * [Dive Into Python](http://www.diveintopython.net/) @@ -626,7 +623,7 @@ print(say(say_please=True)) # Can you buy me a beer? Please! I am poor :( * [Python Module of the Week](http://pymotw.com/3/) * [A Crash Course in Python for Scientists](http://nbviewer.ipython.org/5920182) -### Dead Tree +### 书籍(也是英文) * [Programming Python](http://www.amazon.com/gp/product/0596158106/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596158106&linkCode=as2&tag=homebits04-20) * [Dive Into Python](http://www.amazon.com/gp/product/1441413022/ref=as_li_tf_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1441413022&linkCode=as2&tag=homebits04-20) From cd4c3a4ad8de2668ed6caad2df40dc470a80a4a0 Mon Sep 17 00:00:00 2001 From: Geoff Liu Date: Wed, 5 Nov 2014 13:05:47 -0700 Subject: [PATCH 10/11] Done with Chinese, mostly --- zh-cn/python3-cn.html.markdown | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/zh-cn/python3-cn.html.markdown b/zh-cn/python3-cn.html.markdown index 1f294ebb..4059c876 100644 --- a/zh-cn/python3-cn.html.markdown +++ b/zh-cn/python3-cn.html.markdown @@ -123,8 +123,7 @@ False or True #=> True # None是一个对象 None # => None -# Don't use the equality "==" symbol to compare objects to None -# Use "is" instead. This checks for equality of object identity. +# 当与None进行比较时不要用 ==,要用is。is是用来比较两个变量是否指向同一个对象。 "etc" is None # => False None is None # => True @@ -482,52 +481,50 @@ filter(lambda x: x > 5, [3, 4, 5, 6, 7]) # => [6, 7] #################################################### -# We subclass from object to get a class. +# 定义一个继承object的类 class Human(object): - # A class attribute. It is shared by all instances of this class + # 类属性,被所有此类的实例共用。 species = "H. sapiens" - # Basic initializer, this is called when this class is instantiated. - # Note that the double leading and trailing underscores denote objects - # or attributes that are used by python but that live in user-controlled - # namespaces. You should not invent such names on your own. + # 构造方法,当实例被初始化时被调用。注意名字前后的双下划线,这是表明这个属 + # 性或方法对Python有特殊意义,但是允许用户自行定义。你自己取名时不应该用这 + # 种格式。 def __init__(self, name): # Assign the argument to the instance's name attribute self.name = name - # An instance method. All methods take "self" as the first argument + # 实例方法,第一个参数总是self,就是这个实例对象 def say(self, msg): return "{name}: {message}".format(name=self.name, message=msg) - # A class method is shared among all instances - # They are called with the calling class as the first argument + # 类方法,被所有此类的实例共用。第一个参数是这个类对象。 @classmethod def get_species(cls): return cls.species - # A static method is called without a class or instance reference + # 静态方法。调用时没有实例或类的绑定。 @staticmethod def grunt(): return "*grunt*" -# Instantiate a class +# 构造一个实例 i = Human(name="Ian") -print(i.say("hi")) # prints out "Ian: hi" +print(i.say("hi")) # 印出 "Ian: hi" j = Human("Joel") -print(j.say("hello")) # prints out "Joel: hello" +print(j.say("hello")) # 印出 "Joel: hello" -# Call our class method +# 调用一个类方法 i.get_species() # => "H. sapiens" -# Change the shared attribute +# 改一个共用的类属性 Human.species = "H. neanderthalensis" i.get_species() # => "H. neanderthalensis" j.get_species() # => "H. neanderthalensis" -# Call the static method +# 调用静态方法 Human.grunt() # => "*grunt*" From 1d665b9c0734ac606c2f8fa8b71c22c1d7ac377b Mon Sep 17 00:00:00 2001 From: Geoff Liu Date: Wed, 5 Nov 2014 13:12:35 -0700 Subject: [PATCH 11/11] Missed a few lines --- zh-cn/python3-cn.html.markdown | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/zh-cn/python3-cn.html.markdown b/zh-cn/python3-cn.html.markdown index 4059c876..1b3f5086 100644 --- a/zh-cn/python3-cn.html.markdown +++ b/zh-cn/python3-cn.html.markdown @@ -184,8 +184,8 @@ li[:3] # => [1, 2, 4] li[::2] # =>[1, 4] # 倒排列表 li[::-1] # => [3, 4, 2, 1] -# Use any combination of these to make advanced slices -# li[start:end:step] +# 可以用三个参数的任何组合来构建切割 +# li[始:终:步伐] # 用del删除任何一个元素 del li[2] # li is now [1, 2, 3] @@ -433,9 +433,9 @@ all_the_args(1, 2, a=3, b=4) prints: # 调用可变参数函数时可以做跟上面相反的,用*展开序列,用**展开字典。 args = (1, 2, 3, 4) kwargs = {"a": 3, "b": 4} -all_the_args(*args) # equivalent to foo(1, 2, 3, 4) -all_the_args(**kwargs) # equivalent to foo(a=3, b=4) -all_the_args(*args, **kwargs) # equivalent to foo(1, 2, 3, 4, a=3, b=4) +all_the_args(*args) # 相当于 foo(1, 2, 3, 4) +all_the_args(**kwargs) # 相当于 foo(a=3, b=4) +all_the_args(*args, **kwargs) # 相当于 foo(1, 2, 3, 4, a=3, b=4) # 函数作用域