python语法总结

 

Python3的关键字有:

and, as, assert, break, class, continue, def, del, 

elif, else, except, False, finally, for, from, global,

if, import, in, is, lambda, None, nonlocal, not, or, pass, 

raise, return, True, try, while, with, yield

 

 

 

列表和元组

#列表是可变的,元组是不可变的,列表用中括号表示,元组用圆括号表示
x = [1,2,3,4,5,6,7,8,9,10]
a = [3, 'ss', 447, 3.14, 'test']        #可以存任何类型

#访问最后三个元素8,9,10
x[7:10]    #索引1是第一个元素的编号,索引2是剩下部分第一个元素编号
3[0]       #第一个元素下标从0开始
x[2:100]   #最后一个一个索引可以超过数组边界
x[-1]      #表示最后一个元素
x[-3:]     #倒数三个元素8,9,10
x[0:10:1] #最后一个索引表示步长为1,结果是[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
x[0:10:2] #结果是[1, 3, 5, 7, 9]
x[0:10:3] #结果是[1, 4, 7, 10]

y=[1,2,3] + [4,5,6]   #列表的相加。如果x=[1,2,3]这样的操作不会改变x,只是创建了副本
[1,2,3] + 'hello'     #列表不能和字符串相加,这样会报错

'python' * 5   #结果  'pythonpythonpythonpythonpython'
[12] * 4       #结果  [12, 12, 12, 12]

3 in x         #in 运算符检查一个元素是否在列表中,结果True
'x' in x       #结果False
len(x)         #结果为10,len是求长度
max(x)         #结果为10,最大值
min(x)         #结果为1,最小值
y=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'ss', 'sdfsdf']
len(y)         #结果为12
max(y)         #报错,整数不能和字符串一起运算
list('hello')  #结果['h', 'e', 'l', 'l', 'o'] ,但是不可以用于整数

del x[2]       #删除列表x 中第三个元素
#分片赋值
name=list('perl')
name[1:]=list('ython')    #此时name为['P','y','t','h','o','n']
name.append(4)            #用于在列表末尾增加新对象,但是不能用于元组,因为元组不可变
name.append('n')          #可以增加各种类型
name.count('n')           #结果为2,计算这个值再列表中出现的次数
name.extend(a)            #将另外一个列表增加到末尾如果a是[1,2],则name为
                          #['p', 'y', 't', 'h', 'o', 'n', 'n', 1, 2]
name.index('n')
name.index("hehe")        #找出某个元素在列表中第一次出现的位置,第一个元素下标为0
x.insert(3,"hehe")        #结果[1, 2, 3, 'hehe', 4, 5, 6, 7, 8, 9, 10]
x.pop()                   #弹出最后一个元素,也就是10
x.append(x.pop())         #可以组合两个函数调用
x.remove('hehe')          #删除一个元素
x.reverse()               #将列表中的元素反向存放,会改变列表内容而不是返回副本
x.sort()                  #按字段排序列表,会改变列表的内容而不是返回副本
                          #注意不能同时排序数字(整数和浮点数)和字符串

x = (1,2,3)               #用圆括号表示为元组(tuple)是不可改变的
y = tuple([1,2,3])        #将列表变成元组
y[1]                      #访问元组的第二个元素
dir(x)                   #打印出元组中所有可以使用的函数
dir(y)                   #打印出列表中所有可以使用的函数

 

 

 

 

 

字典

#和元素列表不同,字典是用大括号表示的
item=[('name','gumby'),('age',42)]
x=dict(item)          #需要注意的是,这里的()内,也就是元组里面只能有2个元素
{'name': 'gumby', 'age': 42}

'name' in x          #检查某个key是否在字典中
del x['age']         #删除键为age的项
x['name']            #返回关联到键name上的值
x[100]='hehe'     #将一组新的键值对关联到x上,这里的key可以随意使用
x.clear()         #清空字典x

#copy只是潜拷贝
a={'username': 'admin', 'machines': ['foo', 'bar', 'baz']}
b=a.copy()
a['username']='mlh'      #此时a 为{'username': 'mlh', 'machines': ['foo', 'bar', 'baz']}
a['machines'].remove('bar') #此时a 为{'username': 'mlh', 'machines': ['foo', 'baz']
                            #b为 {'username': 'admin', 'machines': ['foo', 'baz']

{}.fromkeys(['a1','????'])     #fromkeys只是返回一个新的键值对,不会影响原始的字典内容
a.fromkeys(['a1','????'])      #这样做对a 不会产生影响,a不会新增内容
                               #返回的结果为 fromkeys(['a1','????'])
a.fromkeys(['a2','????'],'unknow')   #结果为 {'a2': 'unknow', '????': 'unknow'}
a.get('aa')                    #获取key对应的值,如果这个key不存在则返回空
a.get('aa','N/A')              #如果可以不存在则返回'N/A',如果用a['aa']key不存在则报错
a.items()                      #返回当前字典的所有键值对
a.keys()                       #返回当前字典的键集合
a.values()                     #返回当前字典的值集合
a.pop('aa')                    #根据给定的键返回值,并将这个键值对从字典中移除
b.setdefault('name','N/A')     #如果name不存在,则设置name为N/A,此时返回N/A
b['name']='gumby'              
b.setdefault('name','N/A')     #此时返回gumby       
a.update(b)                    #将字典b的内容增加到a 中

 

 

 

 

 

字符串

#格式化字符串
format="hello %s %s enough for ya?"
values=("world",'hot')
print(format % values)     #结果 hello world hot enough for ya?

a.find('aa')                        #在一个较长的字符串中查找子字符串,若没找到
                                         #返回-1;否则返回下标(从0开始)
a.find('aa',10)                   #从指定的位置开始查找

dir='','usr','bin','env'          #内容为 ('', 'usr', 'bin', 'env')
'/'.join(dir)                         #结果为 '/usr/bin/env'
a="1+2+3+4+5"
a.split('+')                         #结果为   ['1', '2', '3', '4', '5']
a.replace('+','@')              #结果为    '1@2@3@4@5'
a.lower()                       #转换为小写
a.upper()                       #转换为大写
len(a)                          #字符串长度
dir(a)                          #所有的字符串相关函数可以通过dir获得

基本的转换说明符包括以下部分

1)  %字符:标记转换说明符的开始

2)  转换标志(可选):-表示左对齐;+表示在转换值之前要加上正负号;""(空白字符)表示正数之前保留空格,

      0表示转换值若位数不够则用0填充

3)  最小字段宽度(可选):转换后的字符串至少应该具有该值指定的宽度。如果是* ,则宽度会从值元组中

      读出

4)   点(.) 后跟精度值(可选):如果转换的是实数,精度值就表示出现在小数点后的位数。如果转换的是

      字符串,那么该数字就表示最大字段宽度。如果是* ,那么精度将会从元组中读出

5)  转换类型

转换类型 含义
d,i 带符号的十进制数
o 不带符号的八进制
u 不带符号的十进制
x 不带符号的十六进制(小写)
X 不带符号的十六进制(大写)
e 科学计数法表示的浮点数(小写)
E 科学计数法表示的浮点数(大写)
f,F 十进制浮点数
g 如果指数大于-4或小于精度则和e相同,其他情况与f相同
G 如果指数大于-4或小于精度值则和E相同,其他情况与F相同
C 单字符(接受整数或者单字符串)
r 字符串(使用repr转换任意Python对象)
s 字符串(使用str转换任意Python对象)

 

 

 

 

 

条件,循环和其他语句

name='gumby'
print("hi "+name)            #结果为hi gumby

import somemodule
from somemodule import somefunction
from somemodule import somefunction, antherfunction, otherfunction

import math                      #导入数学模块
math.pow(10,2)                #使用pow()函数
import math from pow       #只导入指定的函数
pow(10,2)                         #这样可以省略模块名称

#如果两个模块都有open函数可以使用别名
module1.open()
module2.open()
import math as foobar
foobar.sqrt(4)                      #结果为2

#序列解包
x,y,z = 1, 2, 3                       #此时x为1,y为2,z为3
x, y = y, x                             #此时x为2,y为1,可以支持更多的变量
value = 1, 2, 3
x,y,z = value                        #此时x为1,y为2,z为3

#链式赋值
x = y = somefunction()
x = somefunction()
y = x
#增量赋值
x += 1
x *= 2

#python中 False None 0 "" () [] {} 都认为是假,其他都是真
False + True + 44          #结果为45
False == 0                 #结果为True
True == 1                  #结果为True
True - 3                   #结果为-2


#判断语句
if name.endswith("gun"):        #注意python没有{}语句,都是靠缩进的,if内的语句块需要缩进
    print("hehe")               #最终会打印hehe,

#if elif else
num = int(input('num'))
if num>0 :
    print('num is positive')
elif num<0 :
    print('num is negative')
else :
    print('num is zero')

 比较运算符

表达式 描述
x is y x和y是同一个对象
x is no y x和y是不同对象
x in y x是y容器(如序列)的成员
x not in y x不是y容器(如序列)的成员

其他运算符

x == y
x < y
x > y
x>= y
x <= y
x != y
不推荐使用 x <> y

 条件和循环语句

'foo'=='foo'            #结果为True
'foo' == 'bar'          #结果为False
x = y = [1,2,3]       
z = [1,2,3]
x == y                    #结果为True
x == z                    #结果为True

#is 运算符判断的是同一性,而不是相等性
x is y                      #结果为True
x is z                      #结果为False

"alpha" < "beta"    #结果为True
#结果为True
'FnOrd'.lower() == ''Fnord'.lower()
[1,2] < [2,1]           #结果为True
[2,[1,4]] < [2,[1,5] #结果为True

#断言,assert后面可以不用跟'age must be realistic'这段解释
age=-1
assert 0 < age < 100 'age must be realistic'
File "<stdin>", line 1
assert 0 < age < 100 'age must be realistic'

#while循环
x=1
while x <=10 :
    print(x)
    x += 1

#for循环
world=['this', 'is', 'an', 'ex', 'parrot']
for word in words :
    print(x)

#使用下标
strings='a+b+c+d+e+f+g'.split('+')
index=0
for s in strings :
    if 'd' in s :
        print(strings[index])
    index+=1

#range函数
for i in range(0,10) :
    print(i)

#反向遍历
for i in range(10,1,-2) :
    print(i)

#break的用法
from math import sqrt
for n range(99,0,-1) : 
    root=sqrt(n)
    if root == int(root) :
        print(n)
        break

#continue的用法,打印基数
for i in range(1,10) :
    if(i%2 == 0) :
        continue
    print(i)

#循环外面可以增加一个else
for math import sqrt
for n in range(99,1,-1) :
    root = sqrt(n)
    if root == int(root)
        print(n)
        break
else :
    print("Didn't find it!")

[x*x for x in range(10)]          #结果为 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[x*x for x in range(10) if x%3==0]    #结果为[0, 9, 36, 81]
[(x,y) for x in range(3) for y in range(3)]
 #结果为[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
#也可以使用如下方式
for x in range(3) :
    for y in range(3) :
        result.append((x,y))


#pass
if name == 'ralph auldus melish' :
    print('welcome')
elif name == 'Enid' :
    pass   #如果不写pass只是空着就会报错,python不允许有空语句
else if name == 'bill gates' :
    print('access denied')


#del
a='hello'
b='world'
a=b        #此时'hello'就会被回收了
a=None     #类似同样的效果,'hello'也会被回收
del a      #b还是为'world',a的删除不影响b


#exec
name='hello'
exec('print(name)')       #相当于动态执行代码print(name)

from math import sqrt
exec 'sqrt=1'
sqrt(4)                   #sqrt会变成变量名而不是函数,所以这样执行就会出错

from math import sqrt
scope={}
exec 'sqrt = 1' in scope
sqrt(4)                   #将sqrt变量名放到定义好的scope名称空间中后续代码就正常了


#eval 和exec类似,但是eval有返回值
a=eval("input('input')")
scope={}
scope['x']=2
scope['y']=3
eval('x*y',scope)

抽象

#定义一个可以接受参数的函数,斐波那契数列
def fibs(num) :
    result = [0,1]
    for i in range(num-2) :
        result.append(result[-2] + result[-1])
    return result

#函数可以返回序列,元素,字典
def foo():
    rerurn [1,2,3,4]

#在函数中改变参数值不影响原始的值,也就是类似传递引用的值跟C和java类似
def bar(str):
    str='aa'

#收集参数,有点像java中的可变参数
def print_params(*params):
    print params
print_params('testing')          #结果testing
print_params(1,2,3)              #结果(1,2,3)
def print_params2(title, *params):
    print title
    print params
print_params('Params:',1,2,3)     #结果Params:\n (1,2,3)

#收集关键字参数
def print_params_4(x,y,z=3, *pospar, **keypar):
    print x,y,z
    print pospar
    print keypar
print_params_4(1,2,3,4,5,6,7,foo=1,bar=2)
#结果
1 2 3
(5,6,7)
{'foo':1, 'bar':2}
print_params_4(1,2)
#结果
1 2 3
()
{}

#反转过程
def add(x,y):return x+y
params=(1,2)
add(*params)        #结果为3

def with_stars(**kwds):
    print kwds['name'], 'is', kwds['age'],'years old'
def without_stars(kwds):
    print kwds['name'], 'is', kwds['age'], 'years old'
args={'name':'Mr gumby', 'age':42}
with_stars(**args)
without_stars(args)
#结果都为 Mr gumby is 42 years old


#作用域
x=1
socpe=vars()      #这里的var是()是内建的函数
scope['x']
#每个函数调用都会创建一个新的作用域
globals()         #返回全局变量的字典,类似vars()
locals()          #返回句柄变量的字典

#使用global 来申明一个变量为全局的
x=1
def change_global(): 
    global x
    x += 1
 change_global()       #x将变为2

#函数的嵌套,也就是函数里面包含函数,外层函数将会返回里层的函数也就是函数本身被返回了
#但并没有被调用
def multiplier(factor):
    def multiplyByFactor(number):
        return number*factor
    return multiplyByFactor
double=multiplier(2)
double(5)          #结果为10
triple=multiplier(3)
triple(3)          #结果为9
multiplier(5)(4)   #结果为20
#类似multiplyByFactor函数存储子封闭作用域的行为叫做闭包(closure)
#外部作用域变量一般来说是不能进行重新绑定的,python3中 nonlocal关键字被引入,他和global关键字的使用方式类似,可以让用户对外部作用域(但并非全局作用域)的变量进行赋值


更加抽象 

#定义一个类
class Person:  
    def setName(self,name):  
        self.name = name  
  
    def getName(self):  
        return self.name  
  
    def greet(self):  
        print("hello i'm "+self.name)


x = Person();
x.setName('aaa')
x.greet()

y = Person()
y.setName('bbb')
y.greet()
x.greet()
#结果
hello i'm aaa
hello i'm bbb
hello i'm aaa



class Service:
    def __inaccessible(self):
	print("bet you can't see me")

    def accessible(self):
	print("the secret message is:")
	self.__inaccessible()

s = Service()
#s.__inaccessible()
s.accessible()
help(Service)
#结果
the secret message is:
bet you can't see me
Help on class Service in module __main__:

class Service
 |  Methods defined here:
 |
 |  accessible(self)

异常

异常 描述
NameError 尝试访问一个没有申明的变量
ZeroDivisionError 除数为0
SyntaxError 语法错误
IndexError 索引超出序列范围
KeyError 请求一个不存在的字典关键字
IOError 输入输出错误(比如你要读的文件不存在)
AttributeError 尝试访问未知的对象属性
ValueError 传给函数的参数类型不正确,比如给int()函数传入字符串形

 

#抛出异常
raise Exception

#自定义异常
class MyException(Exception):pass

#异常的捕获
try:
    1/0
except:
    print('number can't be zero!')

#完成的异常结构
try:
   #......
   #一些逻辑
except (TypeError,ZeroDivisionError) as e:
   #
else:
   #如果没有触发except,则会执行else语句
finally:
   #finally子句一定会被执行


#使用sys模块中的函数
try:
   1/0
except:
    import sys
    tuple = sys.exc_info()  
    tuple
#结果
(<class 'ZeroDivisionError'>, ZeroDivisionError('division by zero',), <traceback  object at 0x00C90A58>)

#如果异常在函数内没有被处理则会继续往上抛
def faulty():
    raise Exception('something is wrong')

def ignore_excepttion():
    faulty()

def handle_exception():
    try:
        faulty()
    except:
        print('exception handled')

#结果
ignore_excepttion()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in ignore_excepttion
  File "<stdin>", line 2, in faulty
Exception: something is wrong

handle_exception()
exception handled

 

 

 

 

 

参考

python中的range函数

 

猜你喜欢

转载自xxniao.iteye.com/blog/2070113