Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1829912
  • 博文数量: 636
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3950
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-06 21:58
个人简介

博客是我工作的好帮手,遇到困难就来博客找资料

文章分类

全部博文(636)

文章存档

2024年(5)

2022年(2)

2021年(4)

2020年(40)

2019年(4)

2018年(78)

2017年(213)

2016年(41)

2015年(183)

2014年(66)

我的朋友

分类: 系统运维

2015-03-23 20:28:59

Python命令行

假设你已经安装好了Python, 那么在Linux命令行输入:

$ python

将直接进入python。然后在命令行提示符>>>后面输入:

>>>print('Hello World!')


可以看到,随后在屏幕上输出:

Hello World!

print是一个常用函数,其功能就是输出括号中得字符串。

(在Python 2.x中,print还可以是一个关键字,可写成print 'Hello World!',但这在3.x中行不通

写一段小程序

另一个使用Python的方法,是写一个Python程序。用文本编辑器写一个.py结尾的文件,比如说hello.py

hello.py中写入如下,并保存:


print('Hello World!')


退出文本编辑器,然后在文本所在文件夹命令行输入:

$python hello.py

来运行hello.py。可以看到Python随后输出


Hello World!

脚本

我们还可以把Python程序hello.py改成一个可执行的脚本,直接执行:

#!/usr/bin/env pythonprint('Hello World!')

需要修改上面程序的权限为可执行:

chmod 755 hello.py

然后再命令行中,输入

./hello.py

就可以直接运行了

总结

print

命令行模式: 运行Python,在命令行输入命令并执行。

程序模式: 写一段Python程序并运行。



变量不需要声明

Python的变量不需要声明,你可以直接输入:

>>>a = 10

那么你的内存里就有了一个变量a, 它的值是10,它的类型是integer (整数)。 在此之前你不需要做什么特别的声明,而数据类型是Python自动决定的。

>>>print a

>>>print type(a)

那么会有如下输出:

10

这里,我们学到一个内置函数type(), 用以查询变量的类型。

回收变量名

如果你想让a存储不同的数据,你不需要删除原有变量就可以直接赋值。

>>>a = 1.3

>>>print a,type(a)

会有如下输出

1.3 

我们看到print的另一个用法,也就是print后跟多个输出,以逗号分隔。

基本数据类型

a=10 # int 整数

a=1.3 # float 浮点数

a=True # 真值 (True/False)

a='Hello!' # 字符串

以上是最常用的数据类型,对于字符串来说,也可以用双引号。

(此外还有分数,字符,复数等其他数据类型,有兴趣的可以学习一下)

总结

变量不需要声明,不需要删除,可以直接回收适用。

type(): 查询数据类型

整数,浮点数,真值,字符串


sequence 序列

sequence(序列)是一组有顺序元素集合

(严格的说,是对象的集合,但鉴于我们还没有引入“对象”概念,暂时说元素)

序列可以包含一个或多个元素,也可以没有任何元素。

我们之前所说的基本数据类型,都可以作为序列的元素。元素还可以是另一个序列,以及我们以后要介绍的其他对象。

序列有两种:tuple(定值表; 也有翻译为元组) 和 list ()

>>>s1 = (2, 1.3, 'love', 5.6, 9, 12, False) # s1是一个tuple

>>>s2 = [True, 5, 'smile'] # s2是一个list

>>>print s1,type(s1)

>>>print s2,type(s2)

tuple和list的主要区别在于,一旦建立,tuple的各个元素不可再变更,而list的各个元素可以再变更

一个序列作为另一个序列的元素

>>>s3 = [1,[3,4,5]]

空序列

>>>s4 = []

元素的引用

序列元素的下标从0开始:

>>>print s1[0]

>>>print s2[2]

>>>print s3[1][2]

由于list的元素可变更,你可以对list的某个元素赋值:

>>>s2[1] = 3.0

>>>print s2

如果你对tuple做这样的操作,会得到错误提示。

所以,可以看到,序列的引用通过s[]实现, int为下标

其他引用方式

范围引用: 基本样式[下限:上限:步长]

>>>print s1[:5] # 从开始到下标4 (下标5的元素 不包括在内)

>>>print s1[2:] # 从下标2到最后

>>>print s1[0:5:2] # 从下标0到下标4 (下标5不包括在内),每隔2取一个元素 (下标为0,2,4的元素)

>>>print s1[2:0:-1] # 从下标2到下标1

从上面可以看到,在范围引用的时候,如果写明上限,那么这个上限本身不包括在内

尾部元素引用

>>>print s1[-1] # 序列最后一个元素

>>>print s1[-3] # 序列倒数第三个元素

同样,如果s1[0:-1], 那么最后一个元素不会被引用 (再一次,不包括上限元素本身

字符串是元组

字符串是一种特殊的元素,因此可以执行元组的相关操作。

>>>str = 'abcdef'

>>>print str[2:4]

总结

tuple元素不可变,list元素可变

序列的引用 s[2], s[1:8:2]

字符串是一种tuple


Python的运算符和其他语言类似

数学运算

>>>print 1+9       # 加法

>>>print 1.3-4      # 减法

>>>print 3*5        # 乘法

>>>print 4.5/1.5    # 除法

>>>print 3**2      # 乘方    

>>>print 10%3       # 求余数

判断

判断是真还是假,返回True/False

>>>print 5==6               # =, 相等

>>>print 8.0!=8.0           # !=, 不等

>>>print 3<3, 3<=3         # <, 小于; <=, 小于等于

>>>print 4>5, 4>=0         # >, 大于; >=, 大于等于

>>>print 5 in [1,3,5]      # 5是list [1,3,5]的一个元素

(还有is, is not等, 暂时不深入)

逻辑运算


True/False之间的运算

>>>print True and True, True and False      # and, “与”运算, 两者都为真才是真

>>>print True or False                     # or, "或"运算, 其中之一为真即为真

>>>print not True                          # not, “非”运算, 取反

可以和上一部分结合做一些练习,比如:

>>>print 5==6 or 3>=3

数学工具

表达式操作符:

+,—,*,/,>>,**,&等

内置数学函数:

pow,abs,round,int,hex,bin等

公用模块:

random,math等

表达式操作符

Python的表达式操作符及程序

操作符                    描述

yield x                  生成器函数发送协议  

lambda args:expression   生产匿名函数

x if y else z            三元选择表达式

x or y                   逻辑或(只有x为假,才会计算y)

x and y                  逻辑与(只有x为真,才会计算y)

not x                    逻辑非

x in y,x not in y        成员关系(可迭代对象,集合)

x is y,x is not y        对象实体测试

xy,x>=y        大小比较,集合子集和超集值相等性操作符

x==y,x!=y

x|y                      位或,集合并集

x^y                      位异或,几个对称差

x<>y                左移右移y位

x+y,x-y                  加法/合并,减法,集合差集

x*y,x%y,x/y,x//y         乘法重复,余数格式化,除法,真除法或floor除法

-x,+x                    一元减法,识别

~x                       按位求补(取反)

x**y                     幂运算

x[i]                     索引(序列,映射及其他)点号取属性运算,函数调用

x[i:j:k]                 分片

x(...)                   调用(函数,方法,类及其他可调用的)

x.attr                   属性引用

(...)                    元组,表达式,生成器表达式

[...]                    列表,列表解析

{...}                    字典,集合,集合和字典解析

总结

数学 +, -, *, /, **, %

判断 ==, !=, >, >=, <, <=, in

逻辑 and, or, not


缩进

Python最具特色的是用缩进来标明成块的代码。我下面以if选择结构来举例。if后面跟随条件,如果条件成立,则执行归属于if的一个代码块。

先看C语言的表达方式(注意,这是C,不是Python!

if ( i > 0 )
{
    x = 1;
    y = 2;
}

如果i > 0的话,我们将进行括号中所包括的两个赋值操作。括号中包含的就是块操作,它隶属于if。

在Python中,同样的目的,这段话是这样的

if i > 0:
    x = 1
    y = 2

在Python中, 去掉了i > 0周围的括号,去除了每个语句句尾的分号,表示块的花括号也消失了。

多出来了if ...之后的:(冒号), 还有就是x = 1 和 y =2前面有四个空格的缩进。通过缩进,Python识别出这两个语句是隶属于if。

Python这样设计的理由纯粹是为了程序好看。

if语句

写一个完整的程序,命名为ifDemo.py。这个程序用于实现if结构。

i = 1x = 1if i > 0:
    x = x+1print x

$python ifDemo.py  # 运行

程序运行到if的时候,条件为True,因此执行x = x+1,。

print x语句没有缩进,那么就是if之外。

如果将第一句改成i = -1,那么if遇到假值 (False), x = x+1隶属于if, 这一句跳过。 print x没有缩进,是if之外,不跳过,继续执行。

这种以四个空格的缩进来表示隶属关系的书写方式,以后还会看到。强制缩进增强了程序的可读性

复杂一些的if选择:

i = 1 if i > 0:
    print 'positive i'
    i = i + 1elif i == 0:
    print 'i is 0'
    i = i * 10else:
    print 'negative i'
    i = i - 1 print 'new i:',i

这里有三个块,分别属于if, elif, else引领。
Python检测条件,如果发现if的条件为假,那么跳过后面紧跟的块,检测下一个elif的条件; 如果还是假,那么执行else块。
通过上面的结构将程序分出三个分支。程序根据条件,只执行三个分支中的一个。

整个if可以放在另一个if语句中,也就是if结构的嵌套使用:

i  = 5if i > 1:    print'i bigger than 1'print'good'if i > 2:        print'i bigger than 2'print'even better'

if i > 2 后面的块相对于该if缩进了四个空格,以表明其隶属于该if,而不是外层的if。

总结

if语句之后的冒号

以四个空格的缩进来表示隶属关系, Python中不能随意缩进

if  <条件1>:

   statement

elif <条件2>:

   statement

elif <条件3>:

   statement

else:

   statement



循环用于重复执行一些程序块。从上一讲的选择结构,我们已经看到了如何用缩进来表示程序块的隶属关系。循环也会用到类似的写法。

for循环

for循环需要预先设定好循环的次数(n),然后执行隶属于for的语句n次。

基本构造是

for 元素 in 序列: 
    statement

举例来说,我们编辑一个叫forDemo.py的文件

for a in [3,4.4,'life']:    print a

这个循环就是每次从表[3,4.4,'life'] 中取出一个元素(回忆:表是一种序列),然后将这个元素赋值给a,之后执行隶属于for的操作(print)。

介绍一个新的Python函数range(),来帮助你建立表。

idx = range(5)print idx

可以看到idx是[0,1,2,3,4]

这个函数的功能是新建一个表。这个表的元素都是整数,从0开始,下一个元素比前一个大1, 直到函数中所写的上限 (不包括该上限本身)

(关于range(),还有丰富用法,有兴趣可以查阅, Python 3中, range()用法有变化,见评论区)

举例

for a in range(10):    print a**2

while循环

while的用法是

while 条件:
    statement

while会不停地循环执行隶属于它的语句,直到条件为假(False)

举例

>>> i=0
>>> while i<10:
...     print i
...     i=i+1
... 

0
1
2...
 
>>> url='yesterday nocemore'
>>> while url:
...     print url
...     url=url[1:]
... 

yesterday nocemore
esterday nocemore
sterday nocemore
terday nocemore
erday nocemore
rday nocemore
day nocemore
ay nocemore
y nocemore
 nocemore
nocemore
ocemore
cemore
emore
more
ore
re
e

中断循环

continue # 在循环的某一次执行中,如果遇到continue, 那么跳过这一次执行,进行下一次的操作

break # 停止执行整个循环

for i in range(10):    if i == 2:  continueprint i

当循环执行到i = 2的时候,if条件成立,触发continue, 跳过本次执行(不执行print),继续进行下一次执行(i = 3)。

for i in range(10):    if i == 2:        
        breakprint i

当循环执行到i = 2的时候,if条件成立,触发break, 整个循环停止。

总结

range() 建立表

for 元素 in 序列:

while 条件:

continue 跳过本次循环

break 终结循环


函数最重要的目的是方便我们重复使用相同的一段程序。

将一些操作隶属于一个函数,以后你想实现相同的操作的时候,只用调用函数名就可以,而不需要重复敲所有的语句。

函数的定义

首先,我们要定义一个函数, 以说明这个函数的功能。

def square_sum(a,b):
    c = a**2 + b**2    return c

这个函数的功能是求两个数的平方和。

首先,def,这个关键字通知python:我在定义一个函数。square_sum是函数名。

括号中的a, b是函数的参数,是对函数的输入。参数可以有多个,也可以完全没有(但括号要保留)。

我们已经在循环和选择中见过冒号缩进来表示的隶属关系。

c = a**2 + b**2 # 这一句是函数内部进行的运算

return c # 返回c的值,也就是输出的功能。Python的函数允许不返回值,也就是不用return。

return #可以返回多个值,以逗号分隔。相当于返回一个tuple(定值表)。

return a,b,c # 相当于 return (a,b,c)

在Python中,当程序执行到return的时候,程序将停止执行函数内余下的语句。return并不是必须的,当没有return, 或者return后面没有返回值时,函数将自动返回None。None是Python中的一个特别的数据类型,用来表示什么都没有,相当于C中的NULL。None多用于关键字参数传递的默认值。

函数调用和参数传递

定义过函数后,就可以在后面程序中使用这一函数

>>> print square_sum(3,4)
25

Python通过位置,知道3对应的是函数定义中的第一个参数a, 4对应第二个参数b,然后把参数传递给函数square_sum。

(Python有丰富的参数传递方式,还有关键字传递、表传递、字典传递等,基础教程将只涉及位置传递)

函数经过运算,返回值25, 这个25被print打印出来。

我们再看下面两个例子

>>>a = 1>>>def change_integer(a):
...    a = a + 1
...    return a
...>>>print change_integer(a)
2>>>print a
1
#===(Python中 "#" 后面跟的内容是注释,不执行 )>>>b = [1,2,3]>>>def change_list(b):...    b[0] = b[0] + 1...return b
...>>>print change_list(b)[2, 2, 3]>>>print b[2, 2, 3]

第一个例子,我们将一个整数变量传递给函数,函数对它进行操作,但原整数变量a不发生变化

第二个例子,我们将一个表传递给函数,函数进行操作,原来的表b发生变化

对于基本数据类型的变量,变量传递给函数后,函数会在内存中复制一个新的变量,从而不影响原来的变量。(我们称此为值传递

但是对于表来说,表传递给函数的是一个指针,指针指向序列在内存中的位置,在函数中对表的操作将在原有内存中进行,从而影响原有变量。 (我们称此为指针传递

总结

def function_name(a,b,c):
    statement    return something  # return不是必须的

def #定义函数

函数的目的: 提高程序的重复可用性。

return None

通过位置,传递参数。

基本数据类型的参数:值传递

表作为参数:指针传递

练习:

写一个判断闰年的函数,参数为年、月、日。若是是闰年,返回True


阅读(1015) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~