Python3开发随记(1)关键要素

<碎碎念>
2月换了工做,因为工做缘由学习了一些Python的基础,一开始在网上看了廖雪峰老师的Python2.7的教程,本身试着写了一些代码,忽然发现越写越上瘾,而后想好好学习一下,因此买了Python3的书,这一系列的随记就看成学习笔记好了
问题,如何解决windows下python多版本的问题,度娘答案都很麻烦,pythonbrew好像不支持windows。
在Linux下作Python开发的人多很少?纯命令行模式仍是GUI模式下作开发?很好奇哈
能够留言或者邮件给我,相互学习探讨。
谢谢你们
Hosea Lee
hosealee0208@gmail.com
</碎碎念>

Python3开发随记(1)关键要素

这一部分都是些简单的概念,都是一带而过,你们也没必要深究,后面会逐步完善内容,进度随着我看书的速度吧。另外,目前开发使用的是Python2.7,Web开发框架使用的是limodou老师的Uliweb,推荐给你们。其实他也是我如今的领导,哈哈。
python

要素#1:数据类型

Python提供了几种内置的数据类型,如今咱们先来看其中的两种。
web

Python使用int类型表示整数(正整数 或 负整数),使用str类型表示字符串(Unicode字符序列)。例如:express

-973
1634561315465315346135154654313541546132132154658908907896896789789789
0
"Infinitely Demanding"
"Hosea Lee"
"α β ∑"
""
''

上面第二行能够看到一个很大很大的整数,记住,Python所能表示的整数大小只受限于机器内存,而非固定数量的字节数。我猜Python能用于科学计算的缘由之一就是这样的吧。编程

因为Python使用的是Unicode编码,所以字符串中的符号不局限与ASCII字符,好比上面倒数第三行的三个特殊符号。windows

Python使用方括号([])来存取字符序列中的某一项,好比,在Python Shell中,有以下的输入和输出:数组

>>> "Hello world!"[1]
'e'

方括号存取这种语法适用于任意数据类型的数据项,只要该数据的构成是一个序列。好比字符串或列表,这种语法的一致性是Python很吸引个人缘由之一。app

注意:str类型与基本的数值类型都是固定的,也就是说一旦设定,其值就不能改变。框架

>>> "abcde"[0]=1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment

如上,改变字符串"abcde"的第一个字符后控制台报错。dom

str类型与int类型以前能够相互转换,Python的语法datatype(item)是用来作类型转换的,例如:编程语言

>>> int("12")
12
>>> str(12)
'12'

int()转换能够容许在头尾处带有空格,所以,int("  12   ")也是正确的。str()转换几乎能够应用于全部数据项。

错误的类型转换就不举例了,本身去试试就知道了,只要遵循有意义的转换原则通常都是成功的。


要素#2:对象引用

上面咱们了解了定义数据类型,而后咱们要把定义的数据存储在某种数据类型的变量中,可是Python没有这样的变量,而是使用“对象引用”,以下:

x="blue"
y="green"
z=x

上面三条语句中,语法都是objectReference=value。Python不须要预先的声明语句和指定值的类型。第一行中,Python会建立一个str对象,str对象的文本内容为“blue”,同时还建立了一个名为x的对象引用,x引用的就是str对象。咱们能够说“变量x已经被分配了‘blue'这个字符串“。

Python使用”动态类型“机制。即某个对象引用均可以从新引用一个不一样对象(能够是不一样的数据类型)。例如:

>>> route = 666
>>> print(route,type(route))
666 <class 'int'>
>>> route = "Nordic"
>>> print(route,type(route))
Nordic <class 'str'>

咱们建立了一个成为route的对象引用,并将其设置为引用一个新的int型数值666,使用type()输出该对象引用的数据类型(也成为类),咱们能够看输出了<class 'int'>,而后咱们将route这个对象引用引用到一个str类型的对象上,type()输出<class 'str'>,以前的int(666)会被Python进行垃圾回收。


要素#3:组合数据类型

一般,将整个的数据项组合在一块儿会带来很多方便。Python提供了几种组合数据类型,包括关联数组与集合等类型。

咱们先来看一看其中的两种:元组Tuple列表List

元组和列表可用于存储任意数量、任意类型的数据项。

元组tuple是固定的,建立以后就不能改变;

列表list是可变的,能够对其进行插入、移除等操做。

元组使用逗号建立:

>>> "Denmark","Finland","Norway","Sweden"
('Denmark', 'Finland', 'Norway', 'Sweden')
>>> "one",
('one',)

在输出元组的时候,Python使用圆括号将其封装在一块儿,咱们也能够模仿这种机制,老是将本身定义的元组常值包在圆括号中。若是元组只有一个数据项,就必须在数据项后添加一个逗号,不然将被翻译成str类型,例如:

>>> "one"
'one'
>>> "one",
('one',)

如上,

"one"

"one",

是不同的。

空元组使用()就能够建立。若是须要将元组常值做为参数传递,就必须是用括号对其进行封装,以避免混淆。

列表可使用方括号([])建立,以下:

[1,2,3,4,5,6]
['alpha','bravo','charlie','delta','echo']
['zebra',444,-10,"Malkin"]
[]

实质上,列表与元组并不真正存储数据项,而是存放对象引用。

组合数据类型也是对象,所以,咱们也能够将某种组合数据类型嵌套放在其余组合数组类型中,例如:

[("a",),[1,2,"3"],"Hosea"]

全部Python数据项都是某种特定数据类型的“对象”(也叫作“实例”)

其余关于Tuple和List的内容不详述了,和其余语言都差很少的。


要素#4:逻辑操做符

No.1 身份操做符

            因为全部的Python变量实际上都是对象的引用,有时,询问两个或更多的对象引用是否都指向相同的对象是有意义的,is操做符是一个二元操做符,若是其左右两端的对象引用都指向同一个对象,则返回true。

>>> a=["Reservation",3,None]
>>> b=["Reservation",3,None]
>>> a is b
False
>>> b=a
>>> a is b
True

is操做符只须要对比两端对象引用是否指向内存中同一个地址,同一个地址即同一个对象,因此is操做符不对对象自己进行检查,这样速度就会很是快。

最多见的使用is的状况是检查某个数据项是不是NoneNone是一个内置的空对象,一般用做位置标记值,表示“未知“或”不存在“:

>>> a="Something"
>>> b=None
>>> a is not None,b is None
(True, True)

No.2 比较操做符

这些操做符对对象的值进行比较,也就是对象引用所指向的对象:

== != > < >= <=

Python比较操做符的一个特别好用的特性是能够进行结链比较:

>>> a=10
>>> 0<=a<=11
True

No3. 成员操做符

对序列或集合这一类的数据类型,好比字符串、列表或元组,可使用操做符in来测试成员关系,用not in来测试非成员关系:

>>> p=(1,2,3,"4","Hosea")
>>> 2 in p
True
>>> "Hosea" not in p
False

对列表与元组,in操做符使用线性搜索,对很是大的组合类型,速度可能很慢,而对字典或者集合,in操做能够很是快,这些组合数据类型都将在之后再慢慢讲,不急不急。。。

No4. 逻辑运算符

逻辑运算符有三个,and、or、not。

>>> five=5
>>> two=2
>>> zero=0
>>> five and two
2
>>> two and five
5
>>> five and zero
0

返回的是决定结果的操做数而不是布尔值,除非实际上就是布尔操做数

>>> t=True
>>> f=False
>>> t and t
True
>>> t and f
False
>>> t or f
True
>>> f or f
False

要素#5:控制流语句

No.1 if语句

Python的常规if


语句语法以下:

if boolean_expression1:

    suite1

elif boolean_expression2:

    suite2

......

elif boolean_expressionN:

    suiteN

else:

    else_suite

注意,这里没有圆括号或者方括号,冒号千万不要忘记,缩进是Python用来标识代码块结构的重要途径,起初我写这样代码很不适应,但没有几天就习惯了,并且以为这种写法才是最优美且不易混淆的(我的观点,勿喷)

下面来一个tiny case:

if lines < 1000:
    print("small")
elif lines<10000:
    print("medium")
else:
    print("large")

No.2 while语句

while语句用于0次或屡次执行某个suite,循环执行的次数取决于while循环中布尔表达式的状态,语法格式:

while boolean_expression:

        suite

不详述了,没啥可讲的

No.3 for...in语句

Python下的for循环语句重用了关键字 in,在其余上下文中,in是一个成员操做符,语法格式:

for variable in iterable:

        suite

variable将逐一引用iterable中的每个对象,iterable是能够迭代的任意数据类型,包括字符串、列表、元组以及Python的其余组合数据类型。

>>> countries = ["Denmark","Finland","Norway","Sweden"]
>>> for country in countries:
...     print(country)
... 
Denmark
Finland
Norway
Sweden

不详述了,没啥可讲的

No.4 基本的异常处

与Python的其余对象同样,异常也是一个对象,转换为字符串时,异常会产生一条消息文本。语法格式:

try:

    try_suite

except exception1 as variable1:

    exception_suite1

...

except exceptionN as variableN:

    exception_suiteN

上面代码中的“as variable"部分是可选的。咱们也能够只关心产生了某个特定的异常,而不关心其具体的消息文本。

完整的语法更加复杂,好比,每一个except分支均可以处理多个异常,还有可选的else分支,具体内容之后再写,这里点到为止。

再来看看异常处理的工做逻辑:若是try块中的suite都正常执行,且没有产生异常,则except模块会被跳过;若是try块中产生了异常,则控制流会当即跳转到except,那么产生异常的语句后面的suite均不会被执行。若是发生了异常,而且给定了as variable部分,则在异常处理suite内部,variable引用的是异常对象。

若是异常发生在处理except块时,或者某个异常不能与任何一个except块匹配,Python就会在下一个封闭范围内搜索一个匹配的except块。异常处理的搜索是向外扩展的,并能够延展到调用栈内,直到有一个能匹配的异常处理模块,真的找不到的话,程序将终止,并留下一个未处理的异常,Python会打印回溯信息以及异常的消息文本。

栗子:

s = input("enter an integer:")
try:
    i = int(s)
    print("valid integer entered:", i)
except ValueError as err:
    print(err)

若是输入一个浮点数

enter an integer:3.5

那么输出为:

alid literal for int() with base 10: '3.5'

在读的这本书有一个观点我很认同,说不少教程书籍都把异常处理看成一个高级专题,而且通常都在很靠后才会去讲。实际上了解了异常的产生与处理机制对咱们理解编程语言的工做方式以及如何面对bug都是颇有帮助的。深表赞同!在刚入行时候学的是Java,没人关心try没人告诉我还有个try...catch能够来用,吃了很大亏。因此这里真的须要重视!废话完毕,继续!


要素#6:算术操做符

这里和其余编程语言差很少,+-*/ += -= *=等等。

须要注意的,以下:

>>> 12/5
2.4

懂了吗?除法结果不是整数,是浮点值!若是要获得整数能够用int()转一下,或者用剥离操做符//(后面再说这个)

另外,咱们前面说过int类型是固定的,也就是说,一旦赋值,就不能改变,所以,咱们在作相似a+=a这样的操做的时候,其实是建立一个新的int对象来存储结果,而后将对象引用的指向改变到这个新的int对象上,而且若是原先的int对象没有被其余对象引用引用,那么将被Python送入垃圾回收流程。

还有一个,a operator = b与a=a operator b虽然结果同样,可是过程是不同的。前者只查询了一次a的值,后者要查询两次,因此前者效率更高更快!

在对列表List使用+=的时候,原始的List对象会被修改,所以不像固定数据类型,List此时是不会被从新绑定引用的。

题外话,大家考虑过这个问题吗,Python在可变与固定的数据类型上作了处理,使咱们没法直接看到二者的区别,那么,为何还要设定这两种数据类型?统一使用一种不就行了?


要素#7:输入/输出

一个完整的程序是须要交互的,交互是啥?就是输入和输出啊!

前面咱们有用到print(),这就是输出的一种。

Python提供了内置的input()函数,用于接收来自用户的输入。

这个实在没啥讲的,本身去试吧。


要素#8:函数的建立与调用

这个也很少说了,下午开始边看书边写,最后这一个要素感受写不动了。。。草草收场睡觉去。。。

格式:

def functionName(arguments):

        suite

arguments是可选的,若是有多个参数,就必须使用逗号分隔。

每一个Python函数有一个返回值,默认状况下为None,除非咱们使用return value来从函数返回,此时value便是实际的返回值。返回值能够是一个,也能够是一组。

def是一条鱼赋值操做符工做方式相似的语句,执行def时,会建立一个函数对象,同时建立一个带有指定名的对象引用。因为函数也是对象,所以能够存储在组合数据类型的对象中,并做为参数传递给其余函数。

关于模块,Python模块实际上就是包含Python代码的.py文件。可使用import导入一个模块。使用模块中函数的语法格式是moduleName.functionName(arguments)

栗子:

import random
x=random.randint(1,6)
y=random.choice(["apple","banana","cherry","durian"])

这一篇就写到这里吧,都是很浅的内容,后面会根据这些内容作扩展。

这是一个读书笔记,有不对的地方,不全面的地方,但愿你们能指正

发邮件或者留言给我,谢谢^_^

相关文章
相关标签/搜索