python初学笔记

通过上班闲暇时间开始学习一门脚本语言--python,很早前就有老同学建议学习一门脚本语言对未开开发会很有帮助,最初考虑选择哪门语言的时候在python和ruby中纠结了一下,最后选择python主要是感觉它的使用用户更广。

 

  • 开发环境

我是在windows平台下开发的,python版本官方推荐的是2.7和3.3,我选择了后者,附上下载地址

事实上,对于新手来说,2.x和3.x确实有一些改变,如果你用2.x的帮助文档在3.x下开发可能会遇到一些麻烦(比如print由命令变成了函数)。

在windows下安装完成后可以在开始菜单看到python目录,打开python(command line)输入:print("hello world")回车,如果没有报错说明安装成功了。
python初学笔记
 

  • 编辑器

python官方自带了IDLE(Python GUI)编辑器(见上图),当然很多老手都推荐使用这款编辑器,希望新手从0开始,使用这种编辑器没有太多智能提示,很多代码都必须自己编写,这样能提升新手的熟练度。但我觉得这个太麻烦了,所以用了一段时候就放弃了。

随后选择的是python-eclipse插件,在eclipse下开发,这个插件比IDLE更好了一步,但是还是不算完美,要安装pydev可以在eclipse下下载这个插件

最后在ITEye无意看到一个python编辑器的宣传--jetbrains pycharm,下载了社区版试用了一下感觉非常不错,提示健全,反应迅速,一直用到现在。

当然我从老王python也看到一些推荐,因为没试用过就不发表评论了。

 

  • 学习文档

对于新手,有一本好的入门书籍无疑会让你学习效率事半功倍,我看的是《python基础教程(第二版)》,里面内容非常丰富,跟着文档边看边练,很快就会了。而ITEye的python群组共享了另外两本python入门电子书《python先入为主》和《简明Python教程》,前者是老王python给新手的,但是内容相当浅显,对我帮助不大,而后者对python的数据结构、语法等都做了一些总结,建议新手在看了《python基础教程》之后再去看《简明python教程》的基础知识复习一下,但是简明教程中的例子大多跑不起来。

 

  • 代码笔记

好记性不如烂笔头,下面就是在学习python中做的笔记,内容也不多,每隔几天花半个小时温习一下,很快就熟悉了。

#coding=gbk

#input()用户获取用户输入
name=input('what is your name?')
#print()用于输出数据给用户
print ('My name is '+name+'!')

#repr()和str()都可以转换为字符串
#repr()输出对Python比较友好,而str()的输出对用户比较友好
inta = 111
print('repr='+repr(inta)+'  str='+str(inta))

#通过三个双引号或者单引号可创建换行的长字符串
print("""kaka
xi
laoshi
a""")
#通过\n也可以达到换行的效果
print("hello\nworld")
#原始字符串r 作用是让后面的字符串内容不转义,类似于XML中的CDATA
print(r"C:\nnd"); #注意:原始字符串不能以\结尾,即print(r"C:\nnd\")是错误的

#常规序列,java中成为数组
array1 = ['kakaxi',30]
array2 = ['nanuto',15]
array12 = array1 + array2
print(array12)

#索引,通过索引可以获取指定数据
index = "这是一个索引"
print("第一个字:"+index[0])    #从左到右,从0、1、2...
print("最后一个字:"+index[-1]) #从右到左,从-1、-2、-3...
#17*['th']表示连续17个'th',\在最后可以让代码换行
arraya = ['st','nd','rd'] + 17*['th']\
         +['st','nd','rd'] + 7*['th']\
         +['st']
print(arraya)

#分片,可以截取指定的数组片段
numbers = [1,2,3,4,5,6,7,8,9,10]
#1,2默认为数字,则必须转为字符串才能输出repr()
print("取3~6个:"+repr(numbers[3:6]));
print("取最后3个:"+repr(numbers[-3:]));
#[start:end:step]格式前两个是分片,最后一个是步长
#步长为1表示取全部值
print("步长为1:"+repr(numbers[0::1]))
#步长为2表示每隔1个字取值,依次类推
print("步长为2:"+repr(numbers[0::2]))
#步长不能为0但可以为负数可以倒着取值
print("步长为-1:"+repr(numbers[::-1]))
#这种方式可以复制一个新数组
numbersCopy = numbers[:]
numbersCopy = numbersCopy[:3]
#numbersCopy改变了,不影响numbers的值
print(repr(numbersCopy));
print(repr(numbers))

#序列相加 这样会将两个序列合并到一起
array_add = ['a','b','c'] + ['d','e','f']
#序列相乘 用数字x乘以一个序列会生成新的序列,而新序列中原来的序列被重复x次
array_multiply = 5*['demo','test']
#下面是生成一个具有10个空间的空序列,None是内置值,类似于java的null
array_none = [None]*10
array_none[0] = '1'
array_none[1] = 2
#分片赋值,可以理解为在索引1前面添加一个序列
array_none[1:1] = [2,3,4]
#del删除指定序列 del还可以删除其他类型
del array_none[6:]
print('array_none:'+repr(array_none))

#in判断是否有指定数据,返回true,false
inboolean = 'a' in array_add
print(inboolean)

#len()返回序列总共多少个值
print(len(array_add))
#min()返回序列第一个值
print(min(array_add))
#max()返回序列最后一个值
print(max(array_add))

#list()可以将字符串转换为list
print("list()方法:"+repr(list('hello')))

lst = [1,2,3]
#在list后面追加对象
lst.append(4)
print("lst.append():"+repr(lst))

lsta = [1,2,3]
lstb = [4,5,6]
lsta.extend(lstb);
#extend()将序列合并到一起,比+性能要高
print("lst.extend():"+repr(lsta));
#返回第一个匹配的序列索引
print("lst.index():"+repr(lsta.index(2)))
#insert()在指定索引位置新增一个数据
lsta.insert(2,'aaa');
#pop()弹出序列最后一位并且返回原值
print("lst.pop()"+repr(lsta.pop()))
#remove()移出列表中第一个匹配项
lsta.remove(1)
#reverse列表反转
lsta.reverse()
#sort列表重新排序
#lsta.sort()

#前面的列表是可变可修改的,下面介绍的元组是不能修改的
tuple1 = (1,2,3)
#一个元组一定要有逗号结束
tuple2 = (1,)
#创建一个具有3个1的元组
tuple3 = 3*(1,)
#tuple()能将指定数据转换成元组
tuple([1,2,3])
tuple('abc')
#元组的索引访问也很简单
print("元组[1]:"+str(tuple1[1]))
#元组可以用于map映射中的key,而序列是不行的

#字符串格式化,类似于java的占位符,可以将元组中的数据依次填入字符串中补充
str1 = '你%s中%s'
#好像只能是元组才能格式
lstStr1 = ('好','国')
print(str1%lstStr1);
#更多格式化参考:http://www.cnblogs.com/JerySpace/archive/2010/12/17/1909621.html

string = 'This is a string!'
#find返回字符串第一个匹配的索引,没有匹配返回-1
print("string.find():"+ repr(string.find('is')) )
#join()是split的逆方法,用于将数组转换为字符串
seq = ['1','2','3','4','5']
sep = '+'
print("join():"+sep.join(seq))
#lower()字符串全部小写 注:lower会返回一个小写的字符串,string值不变
print('replace:'+string.lower())
#replace()全部替换匹配的字符串 注:replace会返回一个被替换的字符串,string值不变
print('replace:'+string.replace('is','kaka'))
#split()分割字符串并转换成list
print('split:'+repr( string.split(' ') ))
#strip()去字符串两头的空格,类似于java的trim
print(string.strip())

#数据结构“字典”,类似于java的map,有key和value之分,每一组值由逗号分隔
map1 = {'kaka':'30','nanuto':'15','sasiki':'15'}
#len()返回字典的总个数
print("len(d):"+str(len(map1)))
#d[key]直接返回指定key的值
print("d[key]:"+map1['kaka'])
#d[key] = value给指定key赋值
map1['kaka'] = 31
#根据key删除指定map
del map1['sasiki']
#判断是否包含指定key
print("str in map:"+str('nanuto' in map1))
#从map中提取指定key到占位符中
print("map格式化:"+"kaka's age is %(kaka)s" %map1)

map2 = {'A1':'123','A2':'456','A3':'789'}
#copy一份全新的map对象 deepcopy深度复制
map3 = map2.copy()
#clear清空map
map2.clear();
#get()也是根据key获取指定值,比map[index]好的地方是key不存在不会报错
map2.get('A6')
#items将map分解成一个个对象
map2.items()
#items将map转换成迭代器,依次迭代,比items性能高
#map2.iteritems()
#keys和iterkeys与前面类似,只是迭代map中的key
#values和itervalues迭代获取map的值
#pop(key)根据key删除指定数据
map3.pop('A1');
#update利用一个字典更新另一个字段
map3.update(map2);

#import的几种方式
#import math  调用math.sqrt(4)
#import math as foobar 调用foobar.sqrt(4)
#from somemodule import math 调用somemodule.sqrt(4) 前提:somemodule不能有sqrt方法

stringif = 'abcdefg'
#常规的if...else...
if stringif.startswith("abc"):
    print("stringif.startswith abc")
else:
    print("stringif.startswith !abc")

#if...elif...else...
if 1==1:
    print("1==1")
elif 2==2:
    #pass关键字不执行任何逻辑,开发人员可能未完成该片段代码,可以用pass代替防止编译报错
    pass
else:
    print("else")

#while循环只有满足表达式才会退出
printstr = input("print 'a'")
whileCount = 0
while printstr != "a":
    #输入错误超过3次则跳出循环
    if whileCount == 3:
        #break跳出while循环  continue跳出本次逻辑,执行下一次逻辑
        break
    whileCount += 1
    printstr = input("print 'a'")
print("input right!")

forList = ["a","b","c","d","e"]
#for循环
for for_ in forList:
    print("forList:"+for_)
    
forMap = {"a":"1","b":"2","c":"3"}
#for循环Map 获得的是key
for for_ in forMap:
    print("forMap key:"+for_+" value:"+forMap[for_])

#del只能删除变量名,而变量值是不能(也不需要)被开发删除的
delStr = ["删","除"]
copyDelStr = delStr
del delStr
print("del delStr:"+str(copyDelStr))

#exec方法用于运行字符串类型的python语句
exec("print('exec()')")

 

# coding=gbk

#使用def定义一个新方法
def method1(str):
    return "Your parm is:"+str
print(method1("china"))

#help中传入方法名就能够获得该方法的注释信息
help(method1)

def combine(parameter):
    #使用globals()['全局变量']的形式可以获得全局变量名
    print(parameter + globals()['parameter'])
parameter = ' time'
combine('begin')

def combine_():
    #使用global可以在方法内修改全局变量y的值
    global y
    y = y + 1
y = 1
combine_()
print("y's value:"+str(y))

#python支持方法中嵌套方法,这种行为可以称作“闭包”
def multiplier(factory):
    def multiplyByFactory(number):
        return factory*number
    return multiplyByFactory

double = multiplier(2)  #此时获得的是multiplyByFactory方法
print(repr(double(5)))  #此时获得的是multiplyByFactory执行的返回值

#另一种调用嵌套方法
print(repr(multiplier(2)(5)))

 

# coding=gbk

#使用def定义一个新方法
def method1(str):
    return "Your parm is:"+str
print(method1("china"))

#help中传入方法名就能够获得该方法的注释信息
help(method1)

def combine(parameter):
    #使用globals()['全局变量']的形式可以获得全局变量名
    print(parameter + globals()['parameter'])
parameter = ' time'
combine('begin')

def combine_():
    #使用global可以在方法内修改全局变量y的值
    global y
    y = y + 1
y = 1
combine_()
print("y's value:"+str(y))

#python支持方法中嵌套方法,这种行为可以称作“闭包”
def multiplier(factory):
    def multiplyByFactory(number):
        return factory*number
    return multiplyByFactory

double = multiplier(2)  #此时获得的是multiplyByFactory方法
print(repr(double(5)))  #此时获得的是multiplyByFactory执行的返回值

#另一种调用嵌套方法
print(repr(multiplier(2)(5)))

#创建类
class Person:
    def setName(self,name):
        self.name = name
    def getName(self):
        return self.name
    def printName(self):
        print("Your name is:"+self.name)

kaka = Person()
lami = Person()
kaka.setName("kaka")
lami.name = "lami"
kaka.printName()
lami.printName()

class SecurityClass:
    def publicMethod(self):
        print("This is publicMethod")
        self.__privateMethod()
    def __privateMethod(self):#双下划线表示对外隐藏的方法
        print("This is privateMethod")

security = SecurityClass()
security.publicMethod()

#继承父类,通过Class(父类)的形式即可继承父类
class ChlildClass(SecurityClass):
    def publicMethod(self):
        print("This is  childClass's publicMethod")
chlildClass = ChlildClass()
chlildClass.publicMethod()

#可继承多个父类
class ChildsClass(SecurityClass,Person):
    pass

#issubclass(子类,父类)用于判断子类是否继承父类
print("是否继承父类:"+repr(issubclass(ChlildClass,SecurityClass)))
print("是否继承父类:"+repr(issubclass(SecurityClass,ChlildClass)))
#通过Class.__bases__可获得该类继承的所有子类
print("基类集合:"+repr(ChlildClass.__bases__))
print("判断对象是否有该方法:"+repr(hasattr(ChlildClass,'publicMethod')))

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

#try...except...捕获异常
try:
    print(repr(3/0))
except ZeroDivisionError:
    if 1==1:
        print("3/0异常!")
    else:
        raise  #抛出异常

try:
    print(repr(3/0))
except (ZeroDivisionError,Exception):#可以通过园组的形式监听多种异常
        print("3/0异常!")

try:
    print(repr(3/0))
except (ZeroDivisionError,Exception) as e:#通过Exception as e获取异常信息
        print("异常e:"+repr(e))

#except...else...finally...三者可以混用
try:
    print(repr(3/0))
except (ZeroDivisionError,Exception) as e:#通过Exception as e获取异常信息
    print("异常e:"+repr(e))
else:
    print("无异常")
finally:
    print("finally代码块!")

class Demo(SecurityClass):
    #__init__构造方法用于对象创建时使用,__del__析构方法用于对象销毁时调用
    def __init__(self,name='demo'):
        SecurityClass.__init__(self) #可以调用父类的构造方法
        self.name = name

demo = Demo()
print(demo.name)

demo2 = Demo('demo...')
print(demo2.name)

#静态方法
class StaticClass:
    @staticmethod
    def sMethod():
        print("This is static method!")

    @classmethod
    def cMethod(cls):
        print("This is class method!",cls)

StaticClass.sMethod()
StaticClass.cMethod()

nested = [[1,2],[3,4],[5]]
def demoMethod(nested):
    for lst1 in nested:
        for lst2 in lst1:
            yield lst2 #简单生成器,可当做迭代器使用

for number in demoMethod(nested):
    print(number)

#递归生成器,可处理无限层数的列表
def yieldMethod(nested):
    for lst1 in nested:
        for lst2 in yieldMethod(lst1):
            yield lst2

 

__author__ = 'Administrator'
#coding=gbk

#读写文件
source = "C:\\copy\\alibaba.txt"

newWord = '''
大家好

才是真的

好!
'''
#第一种写文件
f = open(source,'w') #w写
f.write(newWord)
f.close()


#第一种读全部内容
f = open(source) #默认只读
try:
    print(f.read())
finally:
    f.close()

#第二种在文件末尾追加
f = open(source,'a')
f.write("你好python!")
f.close()

#第二种一行一行读
print("====第二种====")
f = open(source,'r') #r为只读
while True:
    line = f.readline()
    if not line:
        break
    print(line)#奇怪的是每一行都会换行
f.close()

#注:在大文件下使用readlines(sizehint)比使用read性能要好,原因是前者可以定义缓冲区最大阀值,而后者会占用全部缓冲区.writelines同理!
#更多文件读写,参考http://www.cnblogs.com/allenblogs/archive/2010/09/13/1824842.html

 

__author__ = 'Administrator'
#coding=gbk

import sqlite3
import time

#使用sqlLite进行数据库操作
#sqlLite在高版本python已经成为内置包,所以可以不用引入任何第三方插件使用

#connect传入参数是数据库文件,可以是绝对路径,也可以是相对路径,如果已存在则直接使用,不存在则创建一个新库
conn = sqlite3.connect("testDB.db")
curs = conn.cursor()
conn.commit()
conn.close()

def executeSQL():
    createStr = '''
    CREATE TABLE food(
    id    TEXT PRIMARY KEY,
    name  TEXT,
    price FLOAT
    )
    '''
    conn = sqlite3.connect("testDB.db")
    curs = conn.cursor()

    #①执行表添加操作
    try:
        curs.execute(createStr)
    except sqlite3.OperationalError as e:
        conn.rollback()
        print(repr(e))

    #②执行数据添加操作
    insert = "INSERT INTO food VALUES(?,?,?)"
    values = [time.strftime("%Y%m%d%H%M%S"),'面包',5]
    try:
        curs.execute(insert,values)
        conn.commit()
        print("insert success!")
    except sqlite3.ProgrammingError:
        conn.rollback()
        raise

    #③执行数据查询操作
    query = "SELECT * FROM food"
    curs.execute(query)
    for row in curs.fetchall():
        valueStr = ""
        for value in row:
            #因为price字段是float,所以要str(),如果用repr又是另一种景象,自己尝试
            valueStr = valueStr + str(value) + "  "
        print(valueStr)
    conn.close()

executeSQL()

 

你可能感兴趣的:(python)