Python 语法笔记

linux python 命令

进入命令: pyhton
退出命令:exit() 或 ctrl+z
python file.py 解释py脚本


源代码: file.py
字节码: file.pyc 已编译

     import py_compile
     py_compile.compile("file.py")



优化后的源文件:file.pyo

     python -O -m py_compile file.py



或在 file.py 加 标准写法

   \#!/usr/bin/python
   ...code...



linux解释py

    chmod +x file.py
    ./file.py            #  ./ 表示查找#!/usr/bin/python工具解释
    #或直接 python file.py

运行 pyc pyo 比直接解释py快

输出 print

3.3:print (‘str’)
2.6:print ‘str’

   strHello = "the length of (%s) is %d" %('Hello World',len('Hello World'))
   print (strHello)

   print("%.2f + %.2f =%.2f" %(num1, num2, num1+num2))
   # %()  多个值须加括号

   print(name + " is " + str(age) + " old")   # str()将其转为字符串


变量及运算

   a = 12
   id(a)         # 16698208      获取a的地址
   b = 12
   id(b)         # 16698208     z值相同则 与a的地址相同(引用)
   # 但 执行 a = a+1后 a地址改变指向 13,而 b不变 

   type(num1)
   type(12)       ##显示引用类型 int
   a = 123L         ##将 123 存取为 long int
   复数   a = 2+3j
   字符串 a = 'str'
          a = "str"
          a = """str"""   三重引号(或单引号):注释,doc数据

    str="abcde"  字符串 切片
    则 str[1:4]   ## bcd   下标1开始到4之前
       str[:3]  str[3:]   ## abcd  de
       str[::2]   ## ace  从头至尾 +2 取,2为步长值
       str[-1]    ## e    最右为-1
       str[-4:-1]   ## bcd  默认从左往右取
       str[4:1:-1]   ## dcb  倒着取

   整除法  3.0//2       ## 1.0  取整数  
   幂运算  3**2         ## 9    3^2

   逻辑运算符:
    与 andornot

   global 变量名      ## 强制声明为全局变量


方法

   raw_input("请输入一个整数:")   从键盘上读取原始数据 字符串(包括方向键 删除键)
   int(raw_input())   强制转换为int

   help(list.append)   查看帮助 q 退出,必须是list
   help(len)

   range(i,j[,步进值])
     i为初始值,不选则默认为0  ## range(10)   0-10
     j为终值
     步进值默认为1

  模块
   import funtion     ## function.py
   function.add(2,5)  ## 调用函数
   若导入文件与系统文件同名,则先引入指定目录(默认同目录下)的py文件

  包
   创建一个包名文件夹
   在该文件夹下创建__init__.py文件
   在文件夹内存放脚本文件或已编译脚本
   导入: import pack.mod
        #  pack.mod.fun()import mod as m
          m.fun()
      或  from mod import fun
          fun()
   __name__
   在py文件中若被自己调用则值为__main__
   若被其他py import调用则值为被调用的文件名

例子 :
FUNCTION.py

#!/usr/bin/python

def machine(x,y='milk'):
    print('cost ' + str(x) + ' to buy ' + y)

# if use python FUNCTION.py   the  __name__ is __main__
# if FUNCTION.py is used by other py,  the __name__ is FUNCTION  
if __name__ == '__main__':
    print('Test the function()...\n')
    machine(12)
    print('\nComplete!')

IMPORT.py

#!/usr/bin/python

import FUNCTION

print('Testing the IMPORT...\n')

FUNCTION.machine(9999,'computer')

print('\nComplete!')


序列(列表 元组 字符串)

   len(str)    ##序列长度
   +           ##连接两个序列, str1+str2 拼接
   *           ##重复序列元素  str1*3  重复3次 "#"*20
   in          ## 'bc' in str  True   //  not in
   max() / min()    ## max(str)  取最大字符
   cmp(str1, str2)  ## 1  则 str1 > str2
                    ## -1 则 str1 < str2
                    ## 0  则 str1 == str2

      在内存分配上 python 不同于c语言指针,字符串和元组是不可修改的,
   当给变量重新赋值后,该变量的地址也将发生改变


   元组 () 也可切片
     user = ("Tom", 25, "boy")
     则 user[0]   ## tom
     user[1] = 26   ## 该语句不能被执行,元组不可修改
                       但user = ("Tom", 26, "boy")可以执行,不过地址发生了改变
     name, age, gender = user   ## name=Tom age=25 gender=boy
     赋值方法也可以这样:a,b,c = (1,2,3)s

     一个元素 的元组  a = ("Tom",)   //须加个逗号


   列表 []
     list = ['Tom', 'Lucy', 'Jack', 25]
     list.append("info")  添加
     list.remove("Tom")  或  del(list[0])  删除
     list[2] = 123  修改 但list地址不变  list[2]地址改变
     25 in list  查找  


字典 (哈希表)

   t1 = ["name", "age", "gender"]
   t2 = ["Tom", 25, "boy"]
   zip(t1,t2)    ## [('name', 'Tom'), ('age', 25), ('gender', 'boy')]

   dic = {'name':'Tom', 'age':25, 'gender':'boy'}
   dic['name']    ## Tom     键名key为 name,也可以为变量

   工厂方法 dict()
     fdict = dict(['x',1],['y',2])
   内建方法 fromkeys()  各元素的具有相同的值
     ddict = {}.fromkeys(('x','y'), -1)

   遍历输出字典内容
     for k in dic:
         print(k)  ##键名
         print(dic[k])   ##值

   del dic['name']   ## 删除
   dic.pop('name')   ## 删除并返回键名为'name'的元素值
   dic.clear()       ## 删除字典所有的元素
   del dic           ## 删除整个字典
   dic['tel'] = '12345'   ## 增加
   dic.get('name','Get error!')  ## 找到返回值 否则 返回错误信息
   dic.keys()        ## 返回所有的键名
   dic.values()      ## 返回所有的值


语句

if语句

     if 条件:
         命令     ## 命令每行缩进相同则视为同一等级(四个空格)

     if 条件:         ## elif 和 else 要与 if 对其
         命令         ## 可以嵌套 但需注意对齐
     elif 条件:
         命令
     else:
       命令

   与 andornot

例子:

#!/usr/bin/python

def get_score():
    return int(raw_input("Please input a score: "))

print("Testing the if: ")
score = get_score()

if score >= 90 and score <= 100:
    print("90-100")
elif score >= 60 and score < 90:
    print("60-89")
elif score >=0 and score <60:
    print("0-59")
else:
    print("%d-Invalid Input!" % score)

print("Complete!")


for循环:

     for iterating_var in sequence:
         statements

     for x in seq:
         print('...')
     else:
         print('...')     ##非正常时不会显示
     ## Ctrl + c  停止程序

     for 也有 break   continue
     pass  作为占位用  不做任何操作
     exit()  跳出整个程序

例子:

#!/usr/bin/python

print('Testing the FOR...\n')
fruits = ['banana', 'apple', 'orange']
for i in range(len(fruits)):
   print('Current fruit is:  %s' %fruits[i] )

print('\n')
dic = {'name':'Tom', 'age':25, 'gender':'boy'}
#for in dictionary   method 1
for x in dic:
    print('%s : %s' %(x,dic[x]))

print('\n')
#for in dictionary   method 1
for x,y in dic.items():
    print(x)
    print(y)
print('\nComplete!')

例子:

#!/usr/bin/python

print('Test the for-else....\n')
for x in range(1,5):
    print(x)
    if x == 3:
        break
else:
    print('End')

print('\n')
print('-'*10)

for x in range(1,5):
    print(x)
    if x == 2:
    pass
    if x == 3:
    print('#'*5)
else:
    print('End')

print('\nComplete!')


while 循环

     while 条件:
         statements 

例子:

#!/usr/bin/python

print('Test the while...\n')

while True:
    key = raw_input("Input \'q\' or enter  to quit:")
    if not key:
        break
    if key == 'q' or key == 'Q':
        break
else:
    print('End')

print('\nComplete!')


switch 语句
例子:

#!usr/bin/python
#coding:utf-8

from __future__ import division

def add(x,y):
    return x+y

def sub(x,y):
    return x-y

def multi(x,y):
    return x*y

def div(x,y):
    return x/y

print('Now testing the method that realize the SWICTH by using dictionary\n')

##  the first way use if-else

def oper_before(x,str,y):
    r = 0
    if str == '+':
    r=add(x,y)
    elif str == '-':
    r=sub(x,y)
    elif str == '*':
        r=multi(x,y)
    elif str == '/':
        r=div(x,y)
    else:
    pass
    print(r)

oper_before(5,'*',9)

## the second way to realize SWICTH

oper = {'+':add, '-':sub, '*':multi, '/':div}

def oper_after(x,str,y):
    print oper.get(str)(x,y)

oper_after(4,'+',7)

print('\nComplete!')


定义函数

     def 函数名(参数):
         函数体


   #coding:utf8
   #coding=utf8
   #encoding:utf8
   #encoding=utf8
   #-*- coding:utf8 -*-


函数

  def fun(name="Null",age=0):
      print("%s : %d" %(name,age))



参数为元组(参数个数要相对应)

  t = ('Jack',19)
  fun(*t)



参数为字典(键名需要和函数形参名匹配)

  d = {'name':'Jack','age':19}
  fun(**d)


  def f(x,*args):
      print(x)
      print(args)
  ## args接收元组,以接收多余的参数
  ## f(x,**args) 接收多余的 赋值参数f(1,a=125)



匿名函数 lambda

  f=lambda x,y:x*y     ## 调用 f(2,3)
  ## 等同于 def f(x,y):    return x*y


内置函数

  reduce(function,list)
    l = range(1,6)
    def f(x,y):
        return x*y
    reduce(f,l)
    ## 结果为阶乘 6!   reduce在列表l中依次函数f的参数个数的值,将其结果又作为函数的参数,再在列表中取值


  abs(number)  # 求绝对值
  max()    # 求序列中最大的值
  min()    # 求序列中最小的值
  len()    #求序列长度
  divmod(5,2)    #返回两数的商和余的元组
  pow(x,y)    # 返回x**y
  round(254,2)    # 返回值得小数形式(保留2位小数)
  callable(fun)    #  测试函数fun是否可调用
  isinstance(l,list)    # 测试变量的类型(a,int) ...
    ## if type(l)==type([]) 判断l是否为列表
  cmp(str1,str2)    #  比较两个字符串,前面大1,相等0,前面小-1



强制类型转换

  int()  long()  float()  tuple()
  str()  list()  hex()  oct()  chr()  ord()


  str.capitalize()  将字符串的首字母大写
  str.replace('old','new') 替换字符串(默认替换所有匹配字符串)
  str.split('_')  切换 _ 隔开的字符,返回列表
  ## 当 import String
  ## 改用为 str.replace(str,'old','new')


  filter(function,sequence)  根据函数中返回的True过滤列表
  ##def f(x):
  ##    if x>5:
  ##        return True
  ##filter(f,range(1,8))   ## [6,7,8]


  zip(l1,l2)    # 合并几个列表,每个列表依次取值构成新列表,以最短列表长度为合并后列表长度


  # 合并几个列表,长度不足者取值None
  map(None,l1,l2)

  # 对合并后的列表每个元组进行函数fun处理后再得到新列表
  map(fun,l1,l2)

  ## l1 = [1,3,5]
  ## l2 = [2,4,6]
  ## l3 = [7,8]
  ## zip(l1,l2,l3)   ->  [(1,2,7),(3,4,8)]
  ## map(None,l1,l2,l3) ->  [(1,2,7),(3,4,8),(5,6,None)]
  ## def fun(x,y):  return x+y
  ## map(fun,l1,l2) ->  [3,7,11]


  # 1-99的偶数累加器
  reduce(lambda x,y:x+y, filter(lambda x:x%2==0, range(1,100)))


正则表达式

  import re

  pattern = r'abc'
  re.findall(pattern,'abcrgriabcgjr')
  ## 直接解释 返回找到的所有abc的列表 ['abc','abc']

  r'a[bd]c'    ## abc adc
  r'a[^bd]c'   ## 在方括号中 表示出了abc adc的
  r'^abc'      ## 行首为 abc 的
  r'abc$'      ## 行尾为 abc 的

  '''
  \d   ->   [0-9]
  \D   ->   [^0-9]
  \s   ->   [\t\n\r\f\v]   匹配任何空白字符
  \S   ->   [^\t\n\r\f\v]  匹配任何非空字符
  \w   ->   [a-zA-Z0-9_]    匹配字母数字
  \W   ->   [^a-zA-Z0-9_]   匹配非字母数字
  '''

  r'^010-?\d{8}$'  ##  010-12345678    8位数字
  r'ab*'    ## a后面有0或多个b
  r'ab+'    ## a后面至少有1个b   贪婪模式 显示所有b
  r'ab?'    ## a后面有1个或0个b
  r'ab+?'   ## 非贪婪模式,只显示1个b
  {m,n}     ## 至少重复m次,至多重复n次

  p_tel=re.compile(pattern)
  ## 编译正则  比解释快

  p = re.compile(r'agar',re.I)
  ## 忽略大小写
  ## re.S  使 . 匹配包括换行在内的所有字符
  ## re.M  多行匹配,影响 ^ $
  ## re.X  忽略pattern的多行中换行符

  r'\str'  ## r 可以使反斜杠不会被任何特殊方式处理

  x = p.match('str')  ## 若匹配成功(匹配数据在str最前面)则返回该对象,否则为空
  x.group()    ## 显示所有匹配的结果

  p.search('str')  ## 匹配成功(任意位置)返回对象

  p.finditer('str')  ## 返回迭代对象

  # re模块
  re.sub(pattern, 替换成str,原始str)   ## 替换
  re.subn(pattern, 替换成str,原始str)  ## 替换并返回替换的个数

  str.split('_')   ## 根据 _ 分割
  re.split('[\+-\*]',str)   ## 根据pattern分割

  # 分组( )
  p=r"\w{3}@w+(\.com|\.cn)"
  re.findall(p."[email protected]")  ## .com 优先返回分组内的内容
  re.match(p."[email protected]").group()  ## [email protected] 返回全部

例子:

#!/usr/bin/python

import re
import urllib

def getHtml(url):
    page = urllib.urlopen(url)
    html = page.read()
    return html

def getImg(html):
    reg = r'src="(.*?\.jpg)"'
    imgre = re.compile(reg)
    imglist = re.findall(imgre,html)
    return imglist
    x = 0
    for imgurl in imglist:
    urllib.urlretrieve(imgurl,"./tmp/%d.jpg" %x)
    x++

html = getHtml("http://tieba.baidu.com/p/1840199283")
getImg(html)


拷贝

浅拷贝:对引用的拷贝(只拷贝父对象)
深拷贝:对对象的资源的拷贝


浅拷贝

    import copy
    a = [1,2,'a','b']
    b = a  ## a和b地址相同,任一个改变两个都变
    c = copy.copy(a)  ## 地址与a不同,且不随a改变(前提为非更改父对象的改变)
    ## 但是 id(a[0]) == id(c[0]) 父对象共用,一方改变父对象数据,都要改变



深拷贝

    d = deepcopy(a)


文件操作

  file_handler = open(filename,mode)

  f = open('./test.txt','w')
  f.write("str...")
  f.read()  ## 读取整篇文章的数据
  f.close()  ## 关闭后,才会将写入的数据(在缓冲区)写入到文件中

  open(path,"r+")  ## r+ 为读写操作,指针默认在首位,写入的内容在光标后
  open(path,"w")  ## 读写,先删除原文件或没有时新建一个
  open(path,"a")  ## 写入,文末追加或新建

  str = f.readline()    ## 读取一行, 超出后返回空字符串
  f.readlines()  ## 返回每行的列表
  f.write(str)   ## 清空以前内容
  f.writekines(List)  ## 多行写入

  f.seek(偏移量,选项) ## 选项=0,指向从文件头到偏移量处
                      ## 选项=1,从当前位置向后移动偏移量
                      ## 选项=2,从文件的尾部向前移动偏移量

  f.flush()  ## 数据提交,断点续传(不用先关闭文件后才能生效)


OS 模块

     os.mkdir('dir_test'[, mode=0777])  ## 创建文件夹, 权限
     rmdir(path)  ## 删除文件夹
     listdir(path)  ## 列出文件夹
     getcwd()  ## 获取当前路径
     chdir(path)  ## 切换目录
     isdir(path)  ## 是否为目录
     walk(path)  ## 遍历

例子 OS_LIST_DIR_FILE:

#!/usr/bin/python
#coding:utf8

import os

def dirList(path):
    pre_path=path
    list=os.listdir(pre_path)
    for name in list:
    all_path=pre_path+'/'+name   # or all_path=os.path.join(pre_path,name)
    if(os.path.isdir(all_path)):
        dirList(all_path)
    else:
        print(all_path)

def dirList_walk(path):
    all=[]
    for pre_path,dir_list,file_list in os.walk(path):
    for file_name in file_list:
        all_path=os.path.join(pre_path,file_name)
        all.append(all_path)
    return all

path='/home/jiecxy/Public/py/tmp/dirList'
print(dirList(path))
print('\n\n')
print(dirList_walk(path))
print('\n\n')


异常处理

  try:
      statements
  except Error,msg:
      statements
  fianlly:
      statements

  # 自定义异常
    raise TypeError(ErrMsg)

例子:

#!/usr/bin/python

try:
    print('In try before\n')
    f=open('no_exist.py')
    print('In try after\n ')
except IOError, msg:
    print('Open file exception!')
finally:
    try:
    f.close()
    except NameError, msg:
        pass
    print('In finally!\n')


  '''
  class 类名:
      成员变量
      成员函数  ## 类的方法中至少有一个参数self
  '''

  class Test:
      var = 1
      def fun(self):
          return 'test'
  # 实例化
    t = Test()


MySQL操作

例子:

#!/usr/bin/python

import MySQLdb
conn=MySQLdb.connet(user='root',passwd='',host='127.0.0.1')
cur=conn.cursor()
conn.select_db('test_py_mysql')
cur.execute("insert into userinfo(name,age,gender) value('Jack',20,'boy')")
## sql_add="insert into userinfo(name,age,gender) value(%s,%d,%s)"
## cur.execute(sql_add,('Jack',20,'boy'))   ## the second para is tuple

## sql_adds="insert into userinfo(name,age,gender) values(%S,%d,%s)"
## cur.executemany(sql_add,[('Jack',20,'boy'),('Lucy',19,'girl')])   ## the second para is list

cur.execute("select * from userinfo")
tuple=cur.fetchone()  ## return one record every time

cur.scroll('0','absolute')

cur.fetchmany(10)  ## return 10 records

cur.fetchmany(cur.execute("select * from userinfo"))  ## return all records

cur.close()

conn.close()


实例

中文分词

将句子分词

# -*- coding: utf-8 -*-
"""
Created on Sun Jan 18 15:18:09 2015
@author: jiecxy
"""

def load_dict(filename):
    f = open(filename)
    word_dict = set()
    max_len = 1
    for line in f:
        word = unicode(line.strip(), 'utf-8')
        word_dict.add(word)
        if len(word) > max_len:
            max_len = len(word)
    f.close()
    return max_len, word_dict


def fmm_word_seg(sent, max_len, word_dict):
    begin = 0
    words = []
    sent = unicode(sent, 'utf-8')

    while begin < len(sent):
        for end in range(begin + max_len, begin, -1):
            if sent[begin:end] in word_dict:
               words.append(sent[begin:end])
               break
        begin = end
    return words

max_len, word_dict = load_dict('./temp/lexicon.dic')
sent = raw_input('请输入一个中文句子: ')
words = fmm_word_seg(sent, max_len, word_dict)
for word in words:
    print word


排序

# -*- coding: utf-8 -*-
"""
Created on Sat Jan 17 21:00:07 2015
@author: jiecxy
"""

def linear_search(list, x):
    for i in range(len(lst)):
        if lst[i] == x:
            return i
    return -1

def binary_search(lst, x):
    low = 0
    high = len(lst) + 1

    while low <= high:
        mid = (low + high) / 2
        if lst[mid] == x:
            return mid
        elif lst[mid] > x:
            high = mid - 1
        else:
            low = mid + 1
    return -1

def selection_sort_v1(lst):
    for i in range(len(lst)):
        min_index = i
        for j in range(i + 1, len(lst)):
            if lst[j] < lst[min_index]:
                min_index = j
        lst.insert(i, lst.pop(min_index))

def swap(lst, i, j):
    tmp = lst[i]
    lst[i] = lst[j]
    lst[j] = tmp

def selection_sort_v2(lst):
    for i in range(len(lst)):
        min_index = i
        for j in range(i + 1, len(lst)):
            if lst[j] < lst[min_index]:
                min_index = j
        swap(lst, i, min_index)

def bubble_sort(lst):
    top = len(lst) - 1
    is_exchange = True

    while is_exchange:
        is_exchange = False
        for i in range(top):
            if lst[i] > lst[i + 1]:
                is_exchange = True
                swap(lst, i, i + 1)
        top -= 1



# main

lst = [42, 16, 84, 12, 77, 26, 53]

#sort(lst)
lst.sort()

print lst        


获得某年某月的第一天星期几

# -*- coding: utf-8 -*-

def is_leap_year(year):
    if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
        return True
    else:
        return False

def get_num_of_days_in_month(year,month):
    if month in (1,3, 5, 7, 8, 10, 12):
        return 31
    elif month in (4, 6, 9, 11):
        return 30
    elif is_leap_year(year):
        return 29
    else:
        return 28

def get_total_num_of_days(year, month):
    days = 0
    for y in range(1000, year):
        if is_leap_year(y):
            days += 366
        else:
            days += 365
    for m in range(1, month):
        days += get_num_of_days_in_month(year, m)
    return days

def get_start_day(year, month):
    return (3 + get_total_num_of_days(year, month)) % 7

print get_start_day(2015,1)

你可能感兴趣的:(Python)