跳到主要内容

python基础

基本语法

#!/usr/bin/python3
# -*- coding:UTF-8 -*-
#coding=utf-8

python注释:#注释单行,```、"""多行注释

标识符

  • 第一个字符必须是字母表中的字母或下划线(不能以数字开头)
  • 标识符中的其他部分由字母、数字和下划线组成
  • 标识符对大小写敏感

推荐驼峰命令法

保留关键字

import keyword
keyword.kwlist
['False','None','True','and','as','assert','async','await','break','class','continue','def',
'del','elif','else','except','finally','for','from','global','if','import','in','is',
'lambda','nonlocal','not','or','pass','raise','return','try','while','with','yield']

行和缩进

默认python以换行符为分隔符,如果要将多条python代码放入一行执行使用分号分割即可

import keyword;keyword.kwlist
import requests;print(requests.get(url='https://baidu.com').text)

多行语句执行

total=item_one+\
item_two+\
item_three

格式化输出

#!/usr/bin/python3
#coding='utf-8'
while True:
data = input('please input\n')
if data =='q' or data == 'exit':
exit()
print('this is demo:%s' % data)

列表

arr1 = [0,1,2,3,4,5]

增加元素

list.append('a')  #每次添加一个元素

删除元素

del('a')  #删除元素

字典

对于字典的键有两个限制:

  1. 字典中的键必须独一无二,即在同一个字典中,任何两个键-值对都不能相同;
  2. 键必须是不可变的。因此,字典键不能是列表、字典

值没有这两个限制

取元素的值

dict1={'key1':[1,2,3,4,5,6],'key2':{'key22':'1234abcd'}}
print(dict1['key1'])

添加/修改元素

dict1['key1']='xxx'

删除元素

del list('key1')
del dict1['key1']

元组

元组是一种不可变序列,即创建之后不能再做任何修改

tuple=(1,2,3,4,5,6)

访问通过与列表中的访问方法相同

集合

集合是无序可变序列,使用一对大括号0(这一点和字典比较类似)作为界定符,元素之间使用逗号分隔,同一个集合内的每个元素都是唯一的,元素之间不允许重复

可以使用集合来对列表去重

集合的创建

s1=set()  #创建空集合
s1=set("abcde")

添加集合元素

s.add(x)
s.update(x)

其中参数可以是列表,元组,字典等

移除集合元素

s.remove(x)  #将元素x从集合s中移除,如果元素不存在,则会发生错误
s.discard(x) #如果元素不存在,不会发生错误
s.pop() #随机删除集合中的一个元素

集合的运算

减法:a-b(a中减去与b中相同的元素)

或运算:a|b(a与b中的元素相加去重(保留一个))

与运算:a&b(取a与b中相同的元素)

异或运算:a^b(a与b相加去除相同部分)

条件控制语句

if xxx: 条件
print(xx)
elif xxx: 条件
print(xx)
else:
print(xx)

循环语句

for

list1 = [1,2,3,4,5,6]
for i in list1:
print(i)
for i in range(1,10):
print('%d'%i)

while

i=1
while i<10:
print('%d'%i)
i++

函数

函数的分类:自定义函数和Python内置函数

自定义函数

def demo():
print('hello word')
demo()
def language():
print(('{1) is the {0} {2}!!!'). format('best', 'python',' language'))
language()

有返回值的函数

def demo():
return 'demo';
print(demo())

定义有参数的函数

def demo(lang):
return 'demo'.lang;
print(demo('test'))

python使用class关键字+类名(大驼峰命名法)创建类,类中的函数称之为方法,类中的变量称之为属性。

定义类和方法

实例方法最大的特点就是,它最少也要包含一个 self 参数,用于绑定调用此方法的实例对象(Python 会自动完成绑定)

class Person: 
def say(self,name):
print('hello ',name)
people = Person()
people.say('lyh')

调用类内部方法和属性

class MyCLass:
a='xiaohong'
b='xiaoqiao'
def say_aname(self):
print(self.a)
def say_bname(self):
print(self.b)
def say_name(self):
self.say_aname()
self.say_bname()
tname = MyClass()
tname.say_bname()

文件操作

  • 通过open函数打开文件返回文件对象
  demo = open('demo.txt',encoding='utf-8')  #有中文需要标明utf-8

open不指定打开模式默认为read模式打开

image-20221025100528616

  • 通过文件对象的访问操作文件

    • read:一次性全部读取完,且将文件的内容读取为一个字符串

    • readline:逐行读取,文件的每一行就是一个字符串

    • readlines:默认全部读取完,返回每行组成一个数组

    • write:写文件

      filename ='1.txt'
      filel=open(filename,'w',encoding='utf-8')
      file1.write('Hello lyh!!!')
      file1.writelines('Hello lyh22!!!') #写入多行
      file1.flush()
      filel.close()
      filenamel ='/etc/passwd'
      filename2 ='1.txt'
      file1 = open(filenamel,'r',encoding='utf-8')
      file2 = open(filename2,'w',encoding='utf-8')
      filellist=file1.readlines() #读取多行,返回数组
      for i in filellist:
      file2.writelines(i) #写入多行
      file2.flush()
      file2.close()
      file1.close()
  • 通过文件close关闭文件

    file1 = open(filenamel,'r',encoding='utf-8')
    file1.close()
    • with语句自动关闭文件

      with open('filename.txt','r',encoding='utf-8') as file1:
      demo = file1.read()
      print(demo)
    • try finally关闭文件

      filename1='/etc/passwd'
      filename2='1.txt'
      try:
      file1=open(filename1)
      content=file1.read()
      print(content)
      finally:
      file1.close()

正则表达式

正则表达式主要使用re模块,re模块是python自带模块,不需要使用pip安装,直接import导入即可使用

re.match函数

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none

re.match(pattern,string,flags=0)
re.match(正则表达式,需要匹配的字符串,标志位(修饰符))

匹配成功re.match方法返回一个匹配的对象,否则返回None

使用与re.search相同

re.search函数

demo:

#!/usr/bin/python3
import re
line="Cats Are smarter than dogs"
searchobj=re.search(r'(.*) are (.*?) .*', line,re.M|re.I)
if searchobj:
print("searchobj.group():",searchobj.group()) #匹配到的整个结果
print("searchobj.group(1):",searchobj.group(1))#第一个子表达式的内容
print("searchobj.group(2):",searchobj.group(2))
else:
print("Nothing found!!")

demo说明:

. -> 匹配除换行符以外的任意单个字符。
* -> 匹配前面表达式0次或多次,匹配前面表达式多次。
? -> 表示正则表达式的非贪婪模式,默认.*会尽可能的匹配更多的数据,若加了?则会在表达式内匹配尽可能少的数据返回
.* -> 匹配多个除换行符外的任意字符
*? -> 匹配多个除换行符外的任意字符的非贪婪模式,尽可能在正则中匹配更少的数据。
() -> 表示匹配括号内的表达式,也表示一个组
re.M -> 多行匹配,影响^和$(^表示正则表达式的开始位置,$表示正则表达式的结束位置)
re.l -> 使匹配对大小写不敏感

re.match与re.search的区别

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None,而re.search匹配整个字符串,直到找到一个匹配

re.sub函数

Python的re模块提供了re.sub用于替换字符串中的匹配项

#!/usr/bin/python3
import re
phone = "2004-959-559 # 这是一个电话号码” #定义字符串
#删除注释
num = re. sub(r'#."s', "", phone)#利用#. $正则表达式匹配#开始的任意非换行符字符串,替换为空
#移除非数字的内容
num=re.sub(r'\D',"",phone)
print("电话号码:",num)
num=re.sub(r'\D'"",phone) #\D匹配任意非数字字符串,除了数字都可以匹配到

字符类

image-20221025152926799

特殊字符类

image-20221025154110103

re.conpile函数

compile函数用于编译正则表达式,生成一个正则表达式(Pattern)对象,供match()和search()这两个函数使用

import re
str = 'helloworld'
pattern = re.compile(r'hello.*')
tstr = pattern.match(str)
print(tstr.group())

re.findall函数

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表

import re
str='LYHsafe666LYHsafe222'
tstr = re.findall(r'\d+',str)
print(tstr) #['666','222']

模块

import导入方式和调用

导入:import module 导入整个模块 调用:module.func() 使用相关功能时使用module.的形式 导入:import module as xxx 导入模块并赋予别名 调用:别名.func() 用相关功能时使用别名的形式

from导入方式和调用

导入:from module import * 从模块中导入所有功能(不建议使用) 调用:func() 使用时直接用功能名I 导入:from module import xxx as yyy 从模块中导入某个功能并取别名 调用:yyy 使用时使用别名即可 导入:from module import XXX 从模块中导入某个功能 调用:xxx 使用时直接用功能名称即可

注意:

  1. 模块名一定不要与python的内置模块重名,避免发生冲突
  2. 如果导入的两个模块存在同名的函数,那么后导入模块的函数会覆盖掉先导入的函数

模块测试接口

if __name__ == "__main__":
main()
#如果当前文件是自运行时_name_==_main_,如果是以模块形式导入到别的文件时,_name_==模块名称
#if _name_=="_main_":当该文件是自运行时运行main函数,当被模块导入不自动运行mian函数,运行的话需要导入后调用

这行代码是用来方便用户测试自己写的脚本的功能。这句话通过判断name变量的值来判断模块是被导入还是自己执行(导入不等于__main__)

模块被导入时,模块内直接执行的代码会在导入时执行一次(因此建议将模块测试的代码写在上述语句块中(指定入口名))

常用模块

OS模块

image-20221025170239914

时间日期模块

image-20221025171537739

randow模块

image-20221025171626389

sys模块

image-20221025171637343