Python基础

来源:互联网 发布:淘宝网天猫手机支架 编辑:程序博客网 时间:2024/06/05 21:57

Python语言主要有两个版本。Python2和Python3。在命令行中python默认是Python2,使用python3则使用Python3。

  • Mac下安装iPython的方法
sudo easy_install pip sudo pip install ipython    #sudo pip3 install ipython

注释

  • 使用#开头的是单行注释。
  • 三个单引号或者三个双引号是多行注释
'''这是注释'''
vi xxx.py +lineNumber  直接跳转到lineNumber行进行编辑

编码

py文件中如果有中文,则使用python执行时会报错,python3不会错。解决方法是在第一行加#coding=utf-8 或者 #-*- coding=utf-8 -*-[推荐]

输入

a = input("请输入...")

在python2中,输入的内容是当做代码的。肉疼…
在python3中,输入的内容都当做是字符串
在python中使用raw_input()来实现python3中的input()功能

占位符

name = "bendeng"print("My name is %s"%name)print("My name is %s,%s,%s"%(name,name,name))f = "My name is %s,%s,%s"%(name,name,name)f = "My name is" + name + name + name

%s 表示字符串,%d表示数字

变量

这里写图片描述

使用type(variable)来判断变量的数据类型字符串转整形: int_var = int(str),其它变量转换类似

变量名由字母、下划线和数字组成,且数字不能开头。

这里写图片描述
查看系统的关键字

import keyword keyword.kwlist

运算符

这里写图片描述

!=或者<>是不等于or and 相当于其它语言的  || &&not 相当于 取反符号!for variable in array:    #TODO""0None、[]、{} 在python中判断时为False

字符串

name = "bendeng"name[2]    ->nname[-2]   ->n   负数表示倒数第几个
  • 切片
name[2:5]  ->nde取出第一个索引位置到第二个索引-1位置的一片字符串name[起始位置:终止位置:步长]  步长默认为1逆序:name[-1::-1]或者name[::-1]
  • 操作
    • find name.find("en") ->1
    • rfind name.rfind("en") ->4
    • index rindex 类似于find,找不到抛异常
    • count name.count("en") ->2
    • replace name.replace("en","EN") -> bENdENg | name.replace("en","EN",1) ->bEndeng
    • split name.split("en") ->['b', 'd', 'g']
      • str.split() 默认以多种空白字符串切割
    • endswith name.endswith("ng") -> True
    • startwith name.startswith("be") -> True
    • lower name.lower()
    • upper name.upper() ->BENDENG
    • rjust name.rjust(10) ->' bendeng'
    • center name.center(10) -> ' bendeng '
    • ljust name.ljust(10) -> 'bendeng '
    • lstrip 去左空格
    • rstrip 去右空格
    • strip 去左右空格
    • partition name.partition("en") -> ('b', 'en', 'deng')
    • rpartition
    • splitlines name = "ben\ndeng" name.splitlines() ->['ben', 'deng']
    • isalpha 是否是纯字母
    • isdigit 是否是纯数字
    • isalnum 是否是字母数字
    • isspace 是否是纯空格
    • join str1.join(arr1) 使用str1连接arr1

列表

Python中的列表类似于其它语言的数组,不同的是Python中的列表元素可以是不同的数据类型。

names = ["bendeng","ada","ouyang"]#添加数据names.append("David")names.insert(0,"First") //在某个索引位置添加names2 = ["names1","names2"]names3 = names + names2  //两个列表直接相加names3 = names.extend(names2)append直接添加,extends是扩展,两者是有区别的。#删除数据names.pop()  //弹出最后一个nams.remove(element)  //根据element只删除第一个del names[index]   // 删除某个索引#修改数据names[index] = newValue#查找element in names   //使用in查找列表中是否存在某元素

字典

{key:value}

info = {'name':'bendeng','age':20}info['qq'] = '123456'  #添加或修改del info['qq']   #删除info['qq'] 或   info.get('qq')  #查询。后者不会崩溃info.keys()   #返回key的列表info.values() #返回values的列表info.items()  #返回key-value(元组)的列表

元组

元组和列表用法极其类似。但不同的是使用()表示,而且定义后不可修改,只可查询和遍历。

name = ('ben','deng')a,b = name
  • 元组只有一个元素,使用(a,) 表示
  • 两个变量交换值,可以使用a,b = b,a

函数

def function_name():    code...在函数中使用global关键字修饰的变量会变成全局变量。
  • 缺省参数和命名参数
    只能放在参数列表的最后定义,可以多个。
def function_name(a,b=defaultValue,c=defaultValue):    code...//调用function_name(A,B)  #传给a,b两个形参function_name(A,c=valueC)  #传给a,c两个形参。c=valueC叫命令参数。命名参数只能取形参的参数名
  • 不定长参数
    *args一般定义成args,也可以是其它变量,必须放在形参最后
def function_name(a,b,*args):#*args表示将满足形参个数多的参数给它,属于元组类型    code...def function_name(a,b,*args,**kwargs):#**kwargs是字典类型的不定长参数    code...

拆包

def function_name(a,b,*args,**kwargs):    code...C = (c,)D = {'d':dv}

当调用function_name(A,B,C,D)时,kwargs不会接受参数。这时需要拆包,调用方式如下:function_name(A,B,*C,**D)
* 表示拆元组,**拆字典,相当于调用function_name(A,B,c,'d':dv)

引用

id(var) 获取变量的地址

a = 1b = a

在python中,a,b都指向同一个内存地址,即变量100的地址。

可变与不可变

  • python中,只有列表和字典可变,其他的数据类型不可变。
  • python中的字典数据中只有不可变类型才可以当做key。
  • python中的可变数据类型传参,会对可变数据类型变量进行修改

匿名函数

使用lambda关键字进行匿名函数的定义。像Java8和Swift语言中的闭包。

def function_name(a,b,func):    code...function_name(A,B,lambda x,y:x+y)

可以通过eval(Str)将字符串转换成函数,比如eval("lambda x,y:x+y")

文件

r 只读模式。文件必须存在。
w 写模式,原来有内容则删除。文件不存在则创建。
a 追加模式。
rb 二进制模式只读。这是文件打开的默认模式。
wb 二进制打开只用于写入。
ab 二进制追加。
r+ 打开一个文件用于读写。文件指针件事放在文件开头
w+ 打开一个文件用于读写。文件不存在则创建。
a+ 打开一个文件用于读写。文件不存在则创建。追加模式
rb+
wb+
ab+

  • 打开文件
f = open("1234.txt","w")
  • 关闭文件
f.close()
  • 读取文件
f.read()  #读取文件所有的内容f.read(1) #读取1个字节,指针往下移
  • 写入文件
f.write("")  #写入内容。返回写入文件的长度
  • 其他方法
    • readline() #读取一行
    • readlines() #返回一个列表,每一行是元素
    • seek(offsetBytes,0) #文件定位。offsetBytes负数往左调,正数右调。python3不支持负数
    • tell() #返回文件当前的位置
  • 重命名及删除
import osos.rename(newFileName,oldFileName)os.remove(fileName)
  • 文件夹操作
import osos.mkdir(dirName)       #创建目录os.rmdir(dirName)       #删除目录os.chdir(dirName)       #改变默认目录os.getcwd()             #当前目录os.listdir('dirName')   #获取某目录下的所有文件

面向对象

操作属性和方法的方式类似于JavaScript。

self和其它语言的this关键字类似

  • 定义类
class 类名:    属性列表    property = value  #在class体中定义的属性是类属性    __variable  #以__开头的变量是私有属性,不会被子类继承    方法列表    def __new__(cls):        // TODO        return object.__new__(cls)  #最后一定要调用父类的这个方法    def __init__(self):        //TODO self一般这么写,可以写其它    def __str__(self):        //TODO 类似于Java的toString方法    def __del__(self):        //TODO python自动调用    def __privateMethod():        // #以__开头的是私有方法,不会被继承,也不能在子类中使用    #类方法    @classmethod    def methodName(cls):  #cls一般是这么写,可以写成其它;        // TODO      #静态方法    @staticmethod    def methodName():        // TODO

在python中先调用的new方法创建对象,init负责初始化。这两者合起来类似父类的构造方法

  • 创建对象
var = ClassName()

测量对象的引用计数:

import syssys.getrefcount(object)
  • 继承
class ClassName(ParentClassName):    方法列表#调用父类的方法,类似于Java中的super.methodName();两种方法:1、ParentClassName.methodName(self)2、super().methodName()
  • 多继承
class ClassName(Parent1,Parent2,...):    // TODO

print(ClassName.__mro__) #返回元组,方法调用的遍历顺序

  • 单例模式
class ClassName(object):    __instance = None    def __new__(cls):        if  __instance == None:            __instance = object.__new__(cls)            return __instance        else:            return __instance

异常处理

try:    // TODO    #raise引发一个自定义的异常,类似于Java的throws    raise CustomeException("my customer exception")except CustomeException:    // TODOexcept (ExceptionName1,ExceptionName2):    // TODOexcept Exception as expt:#上面未捕获到的异常一定在这里捕获,放到expt对象中可进行处理    // TODOelse:  #没有异常执行此处    // TODO finally:  #一定会执行到这里    // TODO

自定义异常类

class CustomeException(Exception): #Exception异常的基类    def __init__(self,message):        //TODO

模块

  • 安装模块
sudo pip install ModuleNamesudo pip3 install ModuleName    #python3的安装方式
  • 使用模块
import ModuleNameimport ModuleName as AliasModuleNamefrom ModuleName import functionNamefrom ModuleName import functionName1,functionName2from ModuleName import *  #谨慎使用,后面不同模块的函数名和前面的同名,只会导入后面的函数名。

先搜索当前路径下的模块,找不到再去找系统路径下的模块。

moduleName.__file__   #返回模块的路径
if __name__ == "__main__"    // TODO 如果直接运行,为True。作为模块给别人调用,为False

模块中的__all__定义的是模块被引用的内容,from ModuleName import * 只能使用在__all__ 中定义的属性、方法和类

__all__ = ["functionName","propertyName","className"] 

将几个相关py(模块)文件放在同一个文件夹,在文件夹下创建__init__.py 文件,那么python将此文件夹视为

1、python2必须在文件夹内添加__init__.py才能将文件夹当做包,python3则不必须
2、在__init__.py中定义__all__变量,决定包里能from的模块
3、[Python2]__init__.py中import moduleName,决定包里能import的模块
4、兼容Python3:使用from . import moduleName

模块发布

1、在当前目录新建一个setup.py文件。在文件里写入

from distutils.core import setupsetup(name="bendeng", version="1.0", description="bendeng's module", author="bendeng", py_modules=['packageName.moduleName1', 'packageName.moduleName2'])

2、构建模块

python(python3) setup.py buildpython(python3) setup.py sdist

3、发布后安装
先将.tar.gz解压,cd到目录里

sudo python(python3) setup.py install

给程序传参

方式:

python xxxx.py params

实现

import syssys.argv  #接收params参数

列表推导式

range(num,[num2],[step])   #生成一个列表。用法类似切片

range的风险:python2中使用很大的数字,会申请很大的内存。python3中,没有此风险,按需申请内存。

a = [i for i in range(num1,[num2],[step])]  #列表生成式如:a = [i for i in range(10)]a = [10 for i in range(10)]a = [i for i in range(10) if i % 2 == 0]a = [(i,j) for i in range(10) for j in range(10)]

集合

a = (1,2,3)  #元组b = [1,2,3]  #列表c = {1,2,3}  #集合。不能有重复元素,可以用于去重;支持增删改查。c = set(b)  #列表转集合b = list(c) #集合转列表