Python Course之基础知识介绍
中国hadoop大数据峰会2016北京站3月18-19日在北京即将召开,现在购买门票优惠多多!!!机不可失,快快动起来!报名可以点击阅读原文
原文链接:https://developers.google.com/edu/python/introduction
文章来自:Google Class
本文由chinahadoop.com翻译
关于转载授授权
China Hadoop文章,欢迎个人转发朋友圈,自媒体、媒体、机构转载务必申请授权,后台留言“机构名称+文章标题+转载”,申请过授权的不必再次申请,只要按约定转载即可,但文末需放置China Hadoop二维码。
就像奥利奥配牛奶,本文配合配套视频学习效果更佳。
视频链接:https://www.youtube.com/watch?v=tKTZoB2Vjuk(建议在Wifi环境下看)
语言简介
Python是一种动态的,解释性的(字节码编译)语言。在源代码中没有变数,参数,函数或方法的类型声明。 这使得代码短而灵活,你不用再检查源代码的编译时的类型。 Python跟踪运行时的所有值的类型并且标示运行没有意义的代码。
一个观看Python代码是如何工作好方法是运行Python解释器并输入正确的代码。 如果你曾经有过类似的问题:“如果我添加一个int到一个list中会发生什么 ?”想看它会发生什么,把它输入Python解释器是一个快速且最佳的方式。 (请参见下面来看看到底发生了什么!)
$ python ## Run the Python interpreter
Python2.7.9 (default, Dec302014, 03:41:42)
[GCC 4.1.220080704 (RedHat4.1.2-55)] on linux2
Type"help", "copyright", "credits"or"license"for more information.
>>> a = 6 ## set a variable in this interpreter session
>>> a ## entering an expression prints its value
6
>>> a + 2
8
>>> a = 'hi' ## 'a' can hold a string just as well
>>> a
'hi'
>>> len(a) ## call the len() function on a string
2
>>> a + len(a) ## try something that doesn't work
Traceback (most recent call last):
File"", line 1, in
TypeError: cannot concatenate 'str'and'int' objects
>>> a + str(len(a)) ## probably what you really wanted
'hi2'
>>> foo ## try something else that doesn't work
Traceback (most recent call last):
File"", line 1, in
NameError: name 'foo'isnotdefined
>>> ^D ## type CTRL-d to exit (CTRL-z inWindows/DOS terminal)
正如你可以在上面看到,它很容易进行变量和操作符的实验。 此外,如果代码试图读取还未被赋值的变量,那么解释器就会给出一个运行错误或者在Python的语法中“提出”。 像C ++和Java,Python是区分大小写的,“a”和“A”是不同的变量。虽然行的结束标志着语句的结束,但是不像C ++和Java,Python并不需要在每个语句的结束添加分号。 以一个“#”注释并延伸到行的结尾。
Python源代码
Python源文件使用“py”为扩展名,被称为“模块”。 运行Python模块hello.py最简单的方式是与一个被称作 “python hello.py Alice”的 shell命令一块来执行hello.py中的代码,并传递它的命令行参数“Alice”。 请参阅官方的文档页面。(http://docs.python.org/using/cmdline)
这里有一个非常简单的hello.py程序(注意,代码块分隔严格使用缩进而非花括号-以后会更多!):
#!/usr/bin/env python
# import modules used here — sys is a very standard one
import sys
# Gather our code in a main() function
def main():
print'Hello there', sys.argv[1]
# Command line args are in sys.argv[1], sys.argv[2] …
# sys.argv[0] is the script name itself and can beignored
# Standard boilerplate to call the main() function to begin
# the program.
if __name__ == '__main__':
main()
在命令行中运行这个程序是这样的:
$ pythonhello.py Guido
Hello thereGuido
$ ./hello.pyAlice ## without needing 'python' first (Unix)
Hello thereAlice
输入,命令行参数和len()
在Python文件或者“模块”中的最外层语句,实施一键设置 – 这些语句在第一次模块导入的地方从顶部运行至底部的,设置它的变量和函数。 一个Python模块可直接运行 – 像上述“python hello.py Bob” – 也可以导入其他模块使用。 当一个Python文件直接运行时,特殊变量“__name__”被设置为“__main__”。 常见的公式是if __name__ ==…如上面所说,模块直接运行调用一个main()函数,而不是当模块被其他模块导入时。
在一个标准的Python程序中,列表sys.argv含有sys.argv[0]程序本身,sys.argv[1]中第一个参数等标准的命令行参数。 如果你知道argc ,或参数的数量,你可以简单地使用len(sys.argv)来从Python中请求这个值 ,就像我们在交互式代码解释器中请求字符串的长度一样。 在一般情况下, len()可以告诉你一个字符串是多长,在列表和元组(另一个阵列状的数据结构)中元素的数量,以及字典中键-值对的数量。
用户定义的函数
在Python函数的定义是这样的:
# Defines a "repeat" function that takes 2arguments.
def repeat(s, exclaim):
"""
Returns the string 's' repeated 3 times.
If exclaim is true, add exclamation marks.
"""
result = s + s + s # can also use "s * 3" whichis faster (Why?)
if exclaim:
result = result + '!!!'
return result
还要注意的是如何构成的函数或if语句是怎样被所有同级别的indentation分组。 我们还提出了两种不同的方式来重复字符串,使用+运算符是更加人性化,但*也适用,因为它是Python的“repeat”操作符,meaning that '-' * 10 gives '———-', a neat way to create an onscreen"line."。 在代码注释中,我们认为*比+运行的快,* calculates the size of the resulting object oncewhereas with +, that calculation is made each time + is called。+和*统称为“overloaded”操作符,因为它们对于数字与字符串(以及其他数据类型)意味着是不同的东西。
该def关键字使用它的括号和代码缩进特征来定义它的函数。 函数的第一行可以是描述该函数做什么的一个文档字符串(“文档字符串”)。 文档字符串就像上面的例子那样可以是一行或多行描述。 (是的,这些都是“三重引号”, Python中独有的功能!)在函数中定义的变量属于该函数,所以上面函数的“结果”与另外一个函数变量“结果”是独立的。 该return语句可以采取一个参数,在这种情况下是返回到调用者的值。
下面是调用上面的repeat()函数的代码,打印它返回的值:
def main():
print repeat('Yay', False) ## YayYayYay
print repeat('Woo Hoo', True) ## Woo HooWooHooWoo Hoo!!!在运行时,函数必须在被调用前由一个“def”来执行限定。 这是典型的使用上面调用的函数来def一个main()函数到文件的底部。
缩进
Python一个特点是一段代码的缩进空格会影响它的意义。组成一个函数的语句的逻辑块都应该有相同的缩进,与他们的父函数或“if”或任何别的函数的缩进设置相同。 如果一个组中的任意一行有不同的缩进,它被标记为语法错误。
Python对空格的使用起初感觉有点怪,但它是合乎逻辑的而且我发现我很快就习惯它了。 避免使用制表符,因为它们的缩进方案非常复杂(更不用说TABs在不同平台上可能意味着不同的东西)。在你的编辑器中设置插入空格来代替Python代码中的TABs。
一个初学者常问的问题是,“我应该有多少空间缩进?” 根据官方Python行为指南(PEP 8),(http://python.org/dev/peps/pep-0008/#indentation)你应该用4个空格缩进。 (有趣的事实:谷歌的内部风格指引规定2个空格缩进!)
运行时的代码检测
Python does very little checking at compile time,deferring almost all type, name, etc. checks on each line until that line runs。假设上述的main()像下面这样调用repeat():
def main():
if name == 'Guido':
print repeeeet(name)+ '!!!'
else:
print repeat(name)
if语句包含一个明显的错误,那就是repeat()函数被输入为repeeeet()。 在Python有趣的是…此代码只要在运行时的名称不是“Guido”,那么它就能编译并运行正常。 只有当尝试执行repeeeet()时才会发现没有这样的功能,然后提示有错误。 这也就意味着,当你第一次运行Python程序,你看到的第一个错误可能只是像这样的简单的错别字。 这是有更详细的类型系统的语言领域,像Java语言的优势是:他们能在编译时就找出这样的错误(当然你必须维护所有类型的信息……这是一个权衡)。
变量名
由于Python的变量在源代码中没有任何类型的注释,它对于为你的变量提供一个有意义的名字来提醒自己是怎么回事是很有帮助的。 所以,如果它是一个单一的名称,就是用“name”,如果它是名称的列表,以及“元组”,就用“names”。 许多基本的Python错误都是由于忘了每个变量值的类型造成的,所以用你自己的变量名(所有你真的有的)来帮助保持straight。
至于实际命名的进行,一些语言偏爱用underscored_parts来对由“多个单词”组成的变量命名,一些语言的偏爱camelCasing。 一般来说,Python喜欢(http://python.org/dev/peps/pep-0008/#function-names)下划线的方法,but guides developers to defer to camelCasing ifintegrating into existing Python code that already uses that style。 详情请阅读the section on naming conventions in PEP 8 。(https://www.python.org/dev/peps/pep-0008/#naming-conventions)
正如您可以猜到,像'print'和'while'等关键字不能用作变量名 – 如果你这样做,你会得到一个语法错误。 但是,要注意不要使用built-ins作为变量名。 例如,或许“str”和“list”看起来是好名字,但是你将会覆盖这些系统变量。 Built-ins不是关键字,因此,很容易受到新的Python开发者的误用。
更多关于模块及其命名空间
假设你有一个模块“binky.py”,其中包含了“def foo()”。 该foo函数的全名是“binky.foo”。这样一来,各个Python模块可以随心所欲的命名它们的函数和变量,而且变量名称不会冲突 – module1.foo与module2.foo不同。 在Python的词汇表中,我们会说binky, module1, and module2每个都有自己的“命名空间”,就像你所猜想的那样,这是变量的名称与对象的绑定。
例如,我们有标准的“SYS”模块,它包含了一些标准的系统设备,如argv列表,和exit()函数。 使用“import sys”声明你就可以访问sys模块中的定义,使它们可通过其完全限定域名,如sys.exit()。 (是的,“sys”也有一个命名空间呢!)
import sys
# Now can refer to sys.xxx facilities
sys.exit(0)
有另一个像下面这样的导入格式:“from sys import argv, exit”。 这使得现有的argv和exit()可以通过它们的短名称来获得; 但是,我们建议使用原有的完整形式的名字,因为它更容易确定函数或属性是从哪来的。
有许多模块和包捆绑在标准的Python解释器的安装程序中,所以你不需要做别的事就能使用它们。 这些被统称为“Python标准库”。 常用的模块/包包括:
· sys — access to exit(), argv, stdin, stdout, …
· re — regular expressions
· os — operating system interface, file system
你可以找到所有标准库模块和包的文件http://docs.python.org/library 。
在线帮助, help()和dir()
有多种途径得到关于Python的帮助。
· 在谷歌上搜索与“Python”有关的关键字,像: "python list" or "python stringlowercase"。 排名第一的往往就是答案。由于某些原因这种技术相较其他语言更适合Python语言。
· 官方Python文档网站- docs.python.org -具有高品质的文档。
· 还有一个official Tutor mailing list ,(http://mail.python.org/mailman/listinfo/tutor)专门为那些Python /或编计新手设计!
· 许多问题(和解答)可以在StackOverflow (http://stackoverflow.com/questions/tagged/python)和 Quora(http://quora.com/Python-programming-language)上找到 。
· 使用help() 和 dir()函数(见下文)。
在Python解释器里面,help()函数支撑起各种模块,函数和方法的文档字符串。 这些文档字符串类似于Java的Javadoc。Dir()函数可以告诉你一个对象的属性。 下面是从翻译器中调用help()函数和dir()函数的一些方法:
· help(len) — help string for the built-in len() function; note that it's "len"not "len()", which is a call to the function, which we don't want
· help(sys) — help string for the sys module (must do an import sys first)
· dir(sys) — dir() is like help() but just gives a quick list of itsdefined symbols, or "attributes"
· help(sys.exit) — help string for the exit() function in the sys module
· help('xyz'.split) — help string for the split() method for string objects. You can call help() with that object itself or an example of that object, plus its attribute. Forexample, calling help('xyz'.split) is the same as calling help(str.split).
· help(list) — help string for list objects
· dir(list) — displays list object attributes, including its methods
· help(list.append) — help string for the append() method for list objects
本节完
对文章有疑问或者任何意见欢迎留言
China Hadoop大数据研究网:
http://chinahadoop.com/
中国hadoop技术峰会2016北京站报名参会网站:
http://www.chinahadoop.com/signup.php(也可点击阅读原文来了解详情)
门票价格表
微信名:
HadoopSummit
微信ID:
hadoopinchina
中国Hadoop技术峰会是亚太地区举办最早、规模最大、影响力最广阔的大数据盛会。
Chinahadoop.com是China Hadoop Summit的内容网站。
HadoopSummit是Chinahadoop.com的微信发布平台。