输入输出语句
- python语法
>>> x = 10
>>> if x > 5:
... print("I'm jack")
...
I'm jack
Python不是靠括号决定语法是否结束,而是靠缩进判断程序是否结束。Python语言在语法习惯上有些变化:
- 括号是可选的,但一般不加括号
- 冒号代表符合语句
Python中所有的符合语句,首行以冒号结尾,下一行的嵌套按照缩进格式书写,缩进代表代码块结束,不用使用大括号代表程序结束。
- 用分号表示语句终止
- Python需要严格执行语法缩进,通过语法缩进判断程序的逻辑结构
- 接收用户输入
1。、接收用户输入
>>> info = input('please input you name: ')
在python3中使用input函数接收用户输入,而在python2.6以前的版本使用raw_input接收用户输入
2、判断用户输入的数据是否为纯数字
①字符串对象的isdigit方法
字符串对象的isdigit方法用于检测字符串是否为纯数字,如果是纯数字返回值为真,否则返回值为假
>>> name = 'jack'
>>> age = '20'
>>> name.isdigit() #调用字符串的isdigit方法测试
False
>>> age.isdigit()
True
②四则运算器
③用try测试是否为数字
try测试更加简洁,格式:
try:
测试语句
expect:
测试失败之后的执行语句
else:
测试成功之后的执行的组合语句
注意:else语句是try的组合语句
- print打印函数
在python3.x中,print是一个内置函数,用关键字参数来表示特定模式
在python2.x中,print是语句,拥有自己的特定语法
- print函数的使用
>>> name = 'jack'
>>> age = 18
>>> sex = M
>>> print(name,age,sex)
('jack', 18, 'M')
可以使用sep参数,在打印的灭个对象文本之间插入一个字符串。如果没有指定sep,默认使用空格分开打印的对象文本。
>>> print(name,age,sex,sep=":") #使用:作为分隔符
jack:18:M
>>> print(name,age,sex,sep="") #不使用分隔符
jack18M
使用end参数,在打印的对象文本之后加入一个字符串。默认使用换行符。
>>> print(name,age,sex);print(name,age,sex)
jack 18 M
jack 18 M
>>> print(name,age,sex,end="");print(name,age,sex) #使用end参数,让输出不换行
jack 18 Mjack 18 M
>>> print(name,age,sex,end="->");print(name,age,sex)#使用end参数,在输出内容后面输出其他内容
jack 18 M->jack 18 M
sep参数和end参数可以结合使用
>>> print(name,age,sex,sep=":",end="-> ")
jack:18:M->
也可以使用file参数,把print内容直接输出到指定文件中
>>> print(name,age,sex,sep=":",file=open('test.txt','w'))
- 字符串格式化输出
- 字符串格式化转换类型
格式 | 描述 |
%c | 字符及其ASCII码 |
%s | 字符串(使用str转换任意python对象) |
%r | 字符串(使用repr转换任意python对象) |
%d(%i) | 有符号整数(十进制) |
%u | 无符号整数(十进制) |
%x | 无符号整数(十六进制) |
%X | 无符号整数(十六进制大写字符) |
%e | 浮点数字(科学计数法) |
%E | 浮点数字(科学计数法,用E代替e) |
%f(%F) | 浮点数字(用小数点符号) |
%g | 浮点数字(根据值得大小采用%e或%f) |
%G | 浮点数字(类似于%g) |
%p | 指针(用十六进制打印值得内存地址) |
%n | 存储输出字符的数量放进参数列表的下一个变量中 |
- 转换说明符
基本的转换说明符包含以下部分,注意其中的顺序:
A、%字符:标记转换说明符的开始
B、转换标识(可选):-标识左对齐,+标识在转换值之前要加上正负号;""空白字符表示整数之前保留空格;0表示转换值若位数不够则用0填充
C、最小字段宽度(可选):转换后的字符串至少应该具有该值指定的宽度、如果是*,则宽度会从值元组中读出
D、点(.)后跟精度值(可选):如果转换的是实数,精度值就表示出现在小数点后的位数。如果转换的是字符串,那么该数字就表示最大字段宽度。如果是*,那么精度将会从元组中读出。
注意:如果格式化里面包含了百分号,那么必须使用%%,这样python就不会将百分号误认为是转换说明符了
- 举例
- 基本用法:
>>> print('%s %s %s %d years old' % ('my','name','is',20))
my name is 20 years old
>>> print (' PI is : %f' % math.pi)
PI is : 3.141593
- 字符宽度和精度
>>> print('...%10f...' % math.pi) #输出十位的浮点数
... 3.141593... #通过…可以看到左侧补了两位空格,补全到十位
>>> print('...%10.2f...' % math.pi)
... 3.14... #输出10,小数精度2位,不足位用空格补全
>>> print('...%*.*f...' % (10,5,math.pi))
... 3.14159... #如果精度是*.*,会从值中读取精度
- 符号、对齐和0填充
在字段宽度和精度之前可以(可选)放置一个"标表",该标表的值可以是:
0(零):表示数字将会用0进行填充
+(加号):表示不管是正数还是负数都标示出符号(在对齐时很有用)
-(减号):表示左对齐数值
空格:表示正数前加上空格,这对需要对齐正负数时会很有用
>>> print('...%010.2f...' % math.pi)
...0000003.14... #输出10位,不足位用0补全
>>> print('...%-10.2f...' % math.pi)
...3.14 ... #输出10位,左侧对齐
>>> print('...%+f...' % math.pi)
...+3.141593... #在数值之前输出正负号
Python流程控制
- if条件判断语句
- 单分支判断语句
>>> age = 18
>>> if age >= 16:
... print("too old")
...
too old
- 双分支判断语句
>>> age = 18
>>> if age >= 16:
... print("too old")
... else:
... print("too young")
...
too old
- 多分支判断语句
#!/usr/bin/env python
num = input('please input a num: ')
if not num.isdigit: #判断输出的是否为数字,否则报错
print("error!input a num")
elif int(num) >= 18: #input接收为字符型,转为整型
print("old")
else:
print("young")
- 真值测试
Python中布尔值测试符
任何非零数字或非空对象都为真
>>> if 1:
... print("true")
... else:
... print("false")
...
True
数字零、空对象以及特殊对象被认为假
>>> if 0:
... print("true")
... else:
... print("false")
...
False
比较和相等测试会返回True或False
>>> 2 < 3 , 5 < 3
(True, False)
布尔and和or运算符会返回真或假
>>> 1 and 1
1
>>> 1 and 0
0
>>> 0 or 1 #or测试,会由左至右求值操作,返回第一个为真的操作对象
1
>>> not 1 #如果值为真,就返回假;如果为假,就返回真
False
>>> 3 and 4 , 3 and 7 #如果两侧都为真,则输出右侧的值
(4, 7)
>>> '' and () #如果两侧都为假,则碰到的第一个假会终止运行,并返回第一个值
''
>>> () and ''
()
- 比较运算符
比较元素符条件中最基本的运算符,详见下表:
表达式 | 描述 |
x == y | X等于y |
x < y | X小于y |
x > y | X 大于y |
X >= y | X大于等于y |
X <= y | X小于等于y |
X != y | X 不等于y |
X is y | X和y是同一个对象 |
X is not y | X和y是不同对象 |
X in y | X是y容器(序列等)的成员 |
X not in y | X不是y容器(序列等)的成员 |
>>> a = 'test'
>>> b = 'text'
>>> if a is b:
... print('True')
... else:
... print('False')
...
False
- while循环
while循环只要测试表达式为真,就一直循环
>>> a = 1
>>> while a <= 100:
... print(a)
... a += 1
- 循环特殊符号
- break 跳出整个循环过程
- continue 终止本次循环
>>> a = 1
>>> while a <= 10:
... a += 1
... if a == 5:
... continue
... print(a)
- pass 是一个无运算的占位符,代表什么都不做
用于:
>保证格式完整
>保证语义完整
>>> if age >= 18:
... print("too old")
... else:
... pass
- for循环
- 基本循环
>>> for i in range(4):
... print(i)
- for可以识别多种数据类型,只要这种数据类型支持序列操作。比如字符串、列表、元组
>>> for i in [1,2,3,4]: #for遍历列表
... print(i)
>>> for i in 'jack': #for遍历字符串
... print(i)
>>> for i in (1,2,3,4): #for遍历元组
... print(i)
>>> y = {'name':'jack','age':'18'}
>>> for x in y :
... print(x,'is',y[x])
...
age is 18
name is jack
- range函数
函数原型:range(start, end, scan)
参数含义:
Start:计数从start开始。默认是从0开始
End:计数到end结束,但不包括end
scan:每次跳跃的间距,默认为1
注意:在python2.x中,range返回值是一个列表
在python3.x中,range返回值是一个迭代值,所以所以range(5)得到的值是range(0,5),但是不影响for循环使用,不过要想在命令行中输出列表,需要:list(range(5)
>>> list(range(1,20,2))
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
Python中重要的系统模块
- 在python中执行shell命令
- 调用os模块的system方法
>>> import os
>>> os.system('ls /root')
使用这种方法不能把执行结果赋值变量,进行程序运算
>>> a = os.system('ls /root')
anaconda-ks.cfg install.log install.log.syslog py test.py #命令结果会输出到屏幕,但是变量中只有命令的返回值
>>> print(a)
0
>>> b = os.system('ls /rootoooo')
ls: cannot access /rootoooo: No such file or directory
>>> print(b) #如果命令报错,则返回值为非零
512
- 调用os模块的popen方法
>>> a = os.popen('ls /root')
>>> print(a.read())
通过os.popen()返回的是file read的对象,对其进行读取read()的操作可以看到执行的输出,但是无法读取程序执行的返回值
- 使用subprocess模块
Subprocess是python创建子进程的工具,然后在子进程中执行另一个进程
- 执行系统命令
>>> subprocess.call(['ls','-l'])
>>> subprocess.call(['ls','-l','/'])
#把命令(ls)和选项(-l),以及参数(/)当做列表传递给subprocess.call()
>>> subprocess.call('ls -l',shell=True)
可以使用shell=True这个参数,这个时候,我们使用一整个字符串,而不是一个列表来运行子进程。Python将会运行一个shell,再用这个shell来解释这整个字符串
- 把命令结果赋值变量
如果用call方法赋值,只会把命令返回值赋予变量,如:
>>> a = subprocess.call(['ls','-l'])
>>> print(a)
- #变量a的值是命令的返回值
所以需要使用subprocess模块的check_output方法来给予变量赋值,也可以使用getstatusoutput方法
>>> a = subprocess.getstatusoutput('ls /root')
>>> print(a) #调用getstatusoutput,执行命可以看到返回值与命令结果
(0, 'anaconda-ks.cfg install.log install.log.syslog py test.py')
>>> b = subprocess.check_output(['ls','-l','/root'])
>>> print(b) #可以看到命令执行结果
- OS模块的使用
- os模块概述
python os模块包含普遍的操作系统功能,如果你希望你的程序能够与平台无关的话,这个模块尤为重要
- 常用方法
- os.name
#输出字符串指示正在使用的平台,如果是windows则用'nt'表示,对于Linux、Unix用户,则是'posix'
>>> import os
>>> os.name
'posix'
- os.getcwd()
函数得到当前工作目录,即当前python脚本工作的目录路径
- os.listdir()
返回指定目录下的所有文件和目录名
- os.remove()
删除一个文件
os.remove('test.py')
- os.system() #运行shell命令
>>> os.system('ls -l /root')
- os.path.split()
函数返回一个路径的目录名和文件名
>>> os.path.split('/root/py')
('/root', 'py')
- os.path.isfile()和os.path.isdir(0函数分别检验给出的路径是一个文件还是目录
>>> os.path.isdir('/root')
True
>>> os.path.isfile('anaconda-ks.cfg')
True
- os.path.exists()函数,用来检验给出的目录或文件是否真的存在
>>> os.path.exists('/root')
True
>>> os.path.exists('/rooooooot')
False
- os.path.abspath(name) #获得绝对路径
>>> os.path.abspath('.')
'/root'
>>> os.path.abspath('py')
'/root/py'
- os.path.getsize(name) #获得文件或目录大小
>>> os.path.getsize('/root')
4096
>>> os.path.getsize('/root/py')
4096
>>> os.path.getsize('anaconda-ks.cfg')
1067
(11)os.path.basename() #返回文件名
>>> os.path.basename('/root/anaconda-ks.cfg')
'anaconda-ks.cfg'
(12) os.path.dirname() #返回文件路径
>>> os.path.dirname('/root/anaconda-ks.cfg')
'/root'
(13) os.remove() #删除文件
os.remove('/root/test.sh')
(14) os.rmdir() #删除目录
os.rmdir('test')
(15) os.mkdir() #建立指定目录
>>> os.mkdir('/root/dir') #建立一个目录
>>>os.makedirs('/root/test/dir/jack') #建立多个目录
- logging模块的使用
python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/POST,SNMP,Socket等,甚至可以自己实现具体的日志记录方式。
1、logging使用
>>> import logging
>>> logging.debug('this is a debuf')
>>> logging.warning('this is a debuf')
WARNING:root:this is a debuf #默认只有warning级别打印到屏幕
日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG >NOTSET
- 通过logging.basicConfig函数对日志的输出格式及方式做相关配置
logging.basicConfig函数各参数:
filename:指定日志文件名
filemode:和file函数意义相同,指定日志文件的打开模式,'w'或'a'
format:指定输出的格式和内容,format可以输出很多有用信息,如下所示:
%(levelno)s:打印日志级别的数值
%(levelname)s:打印日志级别名称
%(pathname)s:打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s:打印当前执行程序名
%(funcName)s:打印日志的当前函数
%(lineno)d:打印日志的当前行号
%(sactiome)s:打印日志的时间
%(thread)d:打印线程ID
%(threadName)s:打印线程名称
%(process)d:打印进程ID
%(message)s: 打印日志信息
Datefmt:指定时间格式,同time.strftime()
Level:设置日志级别,默认为logging.WARNING
Stream:指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略。
- time模块的使用
time模块时python的时间模块,在开始之前,首先说明一下几点:
- python中,通常有这几种方式来表示时间:1、时间戳2、格式化的时间字符串3、元组(struct_time)共九个元素。由于python的time模块实现主要调用C库,所以各个平台可能有所不同。
- UTC(Coordnated Universal Time,世界协调时)亦即格林威治天文时间,世界标准时间。在中国为UTC+8.DST(Daylight Saving Time)即夏令时
- 时间戳(timestamp)的方式:通常来说,时间戳表示的是从1970年1月1日08:00:00开始按秒计算的偏移量。运行"type(time。Time())",返回的是float类型。返回时间戳方式的函数主要有time(),clock()等。
- 元组(struct_time)方式:struct_time元组共有9个元素,返回struct_time的函数主要有gmtime(),localtime(),strptime()。
- 查看当前时间
- time_time() #获取当前时间戳
>>> time.time()
1441255787.3995078 #时间戳是按秒计算偏移量
- time.localtime()当前时间的struct_time(元组)形式
>>> time.localtime()
time.struct_time(tm_year=2015, tm_mon=9, tm_mday=3, tm_hour=12, tm_min=50, tm_sec=57, tm_wday=3, tm_yday=246, tm_isdst=0)
time.localtime()输出说明
索引(Index) | 属性(Attribute) | 值(Values) |
0 | tm_year(年) | 比如2013 |
1 | tm_mon(月) | 1-12 |
2 | tm_mday(日) | 1-31 |
3 | tm_hour(时) | 1-23 |
4 | tm_min(分) | 0-59 |
5 | tm_sec(秒) | 0-61 |
6 | tm_wday(weekday) | 0-6(0表示周日) |
7 | tm_yday(一年中第几天) | 1-366 |
8 | tm_isdst(是否是夏令时) | 默认为-1 |
- time.ctime()当前时间的字符串形式
>>> time.ctime()
'Thu Sep 3 13:02:38 2015'
- 其他相关函数
- Gmtime()函数
#gmtime()方法是将一个时间戳转换为UTC时区(0时区)的struct_time
>>> time.gmtime()
time.struct_time(tm_year=2015, tm_mon=9, tm_mday=3, tm_hour=5, tm_min=4, tm_sec=46, tm_wday=3, tm_yday=246, tm_isdst=0)
#查看格林威治标准时间
- Mktime()函数
将一个struct_time或者9个参数的时间元组转化为时间戳
>>> time.localtime()
time.struct_time(tm_year=2015, tm_mon=9, tm_mday=3, tm_hour=13, tm_min=6, tm_sec=58, tm_wday=3, tm_yday=246, tm_isdst=0) #查看当前时间元组
>>> time.mktime(time.localtime())
1441256956.0 #把当前时间元组转为时间戳
>>> time.mktime((2015,9,3,2,2,9,3,127,0))
1441216929.0 #把这个元组转为时间戳
- Strftime函数—把一个代表时间的元组或者struct_time(如由time.localtime()和time.gtime()返回)转化为格式化的时间字符串。如果tuple未指定,将转入time.localtime()。
>>> time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
'2015-09-03 13:16:10' #把当前时间转换为字符串日期
日期格式参数说明:
格式 | 含义 |
%a | 本地(locale)简化星期名称 |
%A | 本地完整星期名称 |
%b | 本地简化月份名称 |
%B | 本地完整月份名称 |
%c | 本地相应的日期和时间表示 |
%d | 一个月中的第几天(01-31) |
%H | 一天中的第几个小时(24小时制,00-23) |
%I | 第几个小时(12小时制,01-12) |
%j | 一年中的第几天(001-366) |
%m | 月份(01-12) |
%M | 分钟数(00-59) |
%p | 本地am或者pm的相应符 |
%S | 秒(01-61) |
%U | 一年中的星期书。(00-53星期天是一个星期的开始)第一个星期之前的所有天数都放在第0周 |
%w | 一个星期中的第几天(0-6,0是星期天) |
%W | 和%u基本相同,不同的是%W以星期一为一个星期的开始 |
%x | 本地相应日期 |
%X | 本地相应时间 |
%y | 去掉世纪的年份(00-99) |
%Y | 完整的年份 |
%Z | 时区的名字(如果不存在为空字符) |
%% | '%'字符 |