Python基础

xiaoxiao2021-02-28  178

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] ->n name[-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") ->2replace name.replace("en","EN") -> bENdENg | name.replace("en","EN",1) ->bEndeng split name.split("en") ->['b', 'd', 'g'] str.split() 默认以多种空白字符串切割endswith name.endswith("ng") -> Truestartwith name.startswith("be") -> Truelower name.lower()upper name.upper() ->BENDENGrjust name.rjust(10) ->' bendeng'center name.center(10) -> ' bendeng 'ljust name.ljust(10) -> 'bendeng 'lstrip 去左空格rstrip 去右空格strip 去左右空格partition name.partition("en") -> ('b', 'en', 'deng')rpartitionsplitlines 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 = 1 b = 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 os os.rename(newFileName,oldFileName) os.remove(fileName) 文件夹操作 import os os.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 sys sys.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: // TODO except (ExceptionName1,ExceptionName2): // TODO except Exception as expt:#上面未捕获到的异常一定在这里捕获,放到expt对象中可进行处理 // TODO else: #没有异常执行此处 // TODO finally: #一定会执行到这里 // TODO

自定义异常类

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

模块

安装模块 sudo pip install ModuleName sudo pip3 install ModuleName #python3的安装方式 使用模块 import ModuleName import ModuleName as AliasModuleName from ModuleName import functionName from ModuleName import functionName1,functionName2 from 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 setup setup(name="bendeng", version="1.0", description="bendeng's module", author="bendeng", py_modules=['packageName.moduleName1', 'packageName.moduleName2'])

2、构建模块

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

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

sudo python(python3) setup.py install

给程序传参

方式:

python xxxx.py params

实现

import sys sys.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) #集合转列表
转载请注明原文地址: https://www.6miu.com/read-59495.html

最新回复(0)