Python笔记(一)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: Python笔记

安装python

安装python解释器 下一步 在下一步 完成后 win+r 输入cmd python

编写第python一个程序

print("hello,world!")

安装模块

pip install 模块名

列出所有模块

pip list

模块的使用

import 模块名

from 模块名import 对象名

python 序列

列表

// 创建列表
student = ['number','id','age']
print(student)
// ['number', 'id', 'age']
// list() 函数将元组 字符串 字典等可迭代对象强转为列表
num = list((1,2,3,4,5))
print(num)
// [1, 2, 3, 4, 5]
// 删除列表
student = ['number','id','age']
del student[0]
print(student)
// ['id', 'age']
// 添加元素
student = ['number','id','age']
student.append('class')
print(student)
// ['number', 'id', 'age', 'class']
// 列表中添加列表
student = ['number','id','age']
lit = [18,20,20]
student.extend(lit)
print(student)
// ['number', 'id', 'age', 18, 20, 20]
// 在指定位置添加元素
li1 = [1,2,3,4]
li2 = '2.0'
li1.insert(2,li2) // 在元素2 后面添加字符串 2.0
print(li1)
// [1, 2, '2.0', 3, 4]
// 删除指定的元素
li1 = [1,2,3,4]
li1.remove(1)
print(li1)
// [2, 3, 4]
//返回指定元素在列表出现的次数
li1 = [1,2,3,4,1,1,1]
ret = li1.count(1)
print(ret)
// 4 1出现4次
// 将列表中的元素逆序
li1 = [1,2,3,4]
li1.reverse()
print(li1)
// [4, 3, 2, 1]
// 对元素进行排序
// key指定排序依据,reverse决定升序(False)还是降序(True)
li1 = [2,5,7,3,1,9]
// 升序
li1.sort(key=str,reverse=False)
print(li1) # [1, 2, 3, 5, 7, 9]
// 降序
li1.sort(key=str,reverse=True)
print(li1) # [9, 7, 5, 3, 2, 1]

元组

tu = (1,2,3)
print(tu)
// (1, 2, 3)

字典

// 基本语法
dic = {'v1':'k1','v2':'k2'}
print(dic)
// {'v1': 'k1', 'v2': 'k2'}
// 通过dict创建字典
dic = dict(name='阿杰',age=18)
print(dic)
// {'name': '阿杰', 'age': 18}
// 修改字典中的元素
dic = dict(name='阿杰',age=18)
dic['age']=20
print(dic)
// {'name': '阿杰', 'age': 20}
// 添加新元素
dic = dict(name='阿杰',age=18)
dic['sex'] = 'man'
print(dic)
// {'name': '阿杰', 'age': 18, 'sex': 'man'}
// 返回字典中所有的元素
dic = dict(name='阿杰',age=18)
dic.items()
print(dic)
//删除字典中的元素
dic = dict(name='阿杰',age=18)
del dic['age']
print(dic)
// {'name': '阿杰'}
总结:
列表外面是中括号
元组外面是花括号
字典外面是大括号

if 判断

age = 40
if age > 30:
  print("回家养老吧")
# 回家养老吧
num = 80
if num >=90:
  print("优秀")
elif num >= 80:
  print("良好")
else:
  print("你太优秀了,学校不是你呆的地方!")

循环结构

for循环

# 打印1+2+3+...+100 的和
sum = 0
for i in range(1,101):
  sum = sum + i
print(sum)

while循环

sum = 0
i = 1
while i < 101:
  sum = sum + i
  i += 1
print(sum)

文件操作

"""
fp = open(文件名,模式,字符编码集)
fp 文件的io对象(文件句柄)
i => input 输入
o => output 输出
对象可以实现操作:
对象.属性
对象.方法()
"""
# 一.文件的写入操作
# (1) 打开文件
fp = open("ceshi1.txt",mode="w",encoding="utf-8") #打开冰箱门
print(fp)
# (2) 写入内容
fp.write("我就是想赛个大象进去") # 把大象塞到冰箱里头
# (3) 关闭文件
fp.close() #关上冰箱门
# 二.文件的读取操作
# (1) 打开文件
fp = open("ceshi1.txt",mode="r",encoding="utf-8")
# (2) 读取内容
res = fp.read()
print(res)
# (3) 关闭文件
fp.close()
# 三.二进制字节流
"""
文件可以存放两种内容:(1)字符串(2)二进制字节流
二进制字节流: 数据传输时的一种格式
表达方式:
(1)b开头 比如b"123" 对字符有要求:ascii编码
(2)如果表达中文,使用encode和decode
# 将字符串和字节流(Bytes流)类型进行转换 (参数写成转化的字符编码格式)
  #encode() 编码 将字符串转化为字节流(Bytes流)
  #decode() 解码 将Bytes流转化为字符串
"""
strvar = b"abc"
# strvar = b"中文" error
print(strvar,type(strvar))
# 把中文变成二进制的字节流
strvar = "我爱你"
res = strvar.encode() # b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0'
print(res)
strvar = b"\xe7\x88\xb1"
res = strvar.decode()
print(res)
# 四.存储二进制字节流 (如果存入的是字节流,不需要指定encoding)
# 写入二进制字节流
fp = open("ceshi2.txt",mode="wb")
strvar = b"\xe7\x88\xb1"
fp.write(strvar)
fp.close()
# 读取二进制字节流
fp = open("ceshi2.txt",mode="rb")
res = fp.read()
print(res) # b'\xe7\x88\xb1'
res2 = res.decode()
print(res2)
fp.close()
# 五.复制文件
"""
图片 音频 视频 都是文件,里面的内容都是二进制字节流
"""
# 1.读取图片当中所有内容(二进制字节流)
fp = open("集合.png",mode="rb")
bytes_str = fp.read()
fp.close()
print(bytes_str)
# 2.把读出来的字节流写入到另外一个文件中
fp = open("jihe2.jpg",mode="wb")
fp.write(bytes_str)
fp.close()
# ### 一 文件扩展模式
# (utf-8编码格式下 默认一个中文三个字节 一个英文或符号 占用一个字节)
#read()   功能: 读取字符的个数(里面的参数代表字符个数)
#seek()   功能: 调整指针的位置(里面的参数代表字节个数)
#tell()   功能: 当前光标左侧所有的字节数(返回字节数)
"""
seek(0)   把光标移动到文件的开头
seek(0,2) 把光标移动到文件的末尾
"""
# r+ 先读后写
"""
fp = open("ceshi2.txt",mode="r+",encoding="utf-8")
# 先读
res = fp.read()
# 后写
fp.write("123")
# 在读
fp.seek(0)
res = fp.read()
print(res,"<=====>")
fp.close()
"""
"""
# r+ 先写后读
fp = open("ceshi2.txt",mode="r+",encoding="utf-8")
# 先写
fp.seek(0,2) # 把光标移动到最后
fp.write("lmn")
# 在读
fp.seek(0) # 把光标移动到文件的开头
res = fp.read()
fp.close()
print(res)
"""
"""
# w+ 可读可写
fp = open("ceshi4.txt",mode="w+",encoding="utf-8")
# 写入
fp.write("你好我的baby")
# 读取
fp.seek(0)
res = fp.read()
print(res)
fp.close()
"""
"""
# a+ 可读可写 (在写入内容时,会强制把光标移动到最后)
# a模式和w模式,默认都能自动创建文件
fp = open("ceshi5.txt",mode="a+",encoding="utf-8")
# 写入
fp.write("今天天气不错")
# 读取
fp.seek(0)
res = fp.read()
print(res)
fp.close()
fp = open("ceshi6.txt",mode="a+",encoding="utf-8")
# 移动光标 (无论如何移动,写入内容都是以追加的形式呈现)
fp.seek(3)
fp.write("456")
fp.close()
"""
# ### 二.read , seek , tell 三个函数使用
fp = open("ceshi6.txt",mode="r+",encoding="utf-8")
# read 里面的参数,单位是字符个数
res = fp.read(3) # 读取3个字符
# seek 移动光标
fp.seek(7) # fp.seek(5) 光标卡在中所代表的三个字节中的中间位置
res = fp.read()
print(res)
# tell 从当前光标往左读取,累计所有的字节数
res = fp.tell()
print(res)
# ### 三.注意点 (中文混合的情况)
"""
# abcd\xe6\x88\x91\xe7\x88\xb1
"""
"""
fp = open("ceshi6.txt",mode="r+",encoding="utf-8")
fp.seek(5)
res = fp.read()
print(res)
fp.close()
"""
# ### 四.with 语法 (可以省略掉close操作)
"""
with open() as fp:
code ..
"""
# 读取图片当中所有内容 (二进制字节流)
"""
with open("集合.png",mode="rb") as fp:
bytes_str = fp.read()
with open("jihe3.gif",mode="wb") as fp:
fp.write(bytes_str)
"""
# 在升级,用三行代码实现
with open("集合.png",mode="rb") as fp1,open("jihe4.gif",mode="wb") as fp2:
bytes_str = fp1.read()
fp2.write(bytes_str)

异常处理

try ... except ...
属于成绩1-100 超出则报错
socre = input("请输入成绩:")
try:
  socre = int(socre)
  if (0 <= socre <= 100 ):
      print("你的成绩为:", socre)
  else:
      print("输入有误,请重试!")
except Exception as a:
  print("nononono")
# 请输入成绩:90
# 你的成绩为:90
# 请输入成绩:190
# 输入有误,请重试!
// try ... except ... else
socre = input("请输入成绩:")
try:
  socre = int(socre)
except Exception as a:
  print("nononono")
else:
  if (0 <= socre <= 100 ):
      print("你的成绩为:", socre)
  else:
      print("输入有误,请重试!")
// try except finally
a = int(input('a:' ))
b = int(input('b:' ))
try:
  div = a/b
  print(div)
except Exception as e:
  print("======")
finally:
print("over")

socket 编程

server:
import socket
# 明确配置变量
ip_port = ('127.0.0.1', 8080)
back_log = 5
buffer_size = 1024
# 创建一个TCP套接字
ser = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 套接字类型AF_INET, socket.SOCK_STREAM   tcp协议,基于流式的协议
ser.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 对socket的配置重用ip和端口号
# 绑定端口号
ser.bind(ip_port) # 写哪个ip就要运行在哪台机器上
# 设置半连接池
ser.listen(back_log) # 最多可以连接多少个客户端
while 1:
  # 阻塞等待,创建连接
  con, address = ser.accept() # 在这个位置进行等待,监听端口号
  while 1:
      try:
          # 接受套接字的大小,怎么发就怎么收
          msg = con.recv(buffer_size)
          if msg.decode('utf-8') == '1':
              # 断开连接
              con.close()
          print('服务器收到消息', msg.decode('utf-8'))
      except Exception as e:
          break
# 关闭服务器
ser.close()
clinet:
import socket
p = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
p.connect(('127.0.0.1', 8080))
while 1:
  msg = input('please input: ')
  # 防止输入空消息
  if not msg:
      continue
  p.send(msg.encode('utf-8')) # 收发消息一定要二进制,记得编码
  if msg == '1':
      break
p.close()

mysql数据库编程

# 导入pymysql库
import pymysql
# 创建连接
db_connection = pymysql.connect(
  host='127.0.0.1',
  user='root',
  password='123456',
  database='mysql',
  charset='utf8'
)
# 使用 cursor() 方法创建一个游标对象
cursors = db_connection.cursor()
# 使用 execute() 方法执行 SQL 查询
cursors.execute("SELECT VERSION()")
# 使用 fetchone() 方法获取单条数据.
data = cursors.fetchone()
# 打印数据
print ("Database version : %s " % data)
# 关闭数据库连接
db_connection.close()
# 创建数据库
import pymysql
# 打开数据库连接
conn = pymysql.connect('localhost', 'root', '123456')
# 使用cursor()方法创建一个游标对象cursor
cursor = conn.cursor() # 游标对象用于执行查询和获取结果
# 创建数据库 连接数据库时
sql = 'create database ajie charset utf8;'
# 执行SQL语句
cursor.execute(sql)
# 关闭数据库连接
conn.close()
# 创建数据表
import pymysql
# 打开数据库连接
conn = pymysql.connect('localhost', 'root', '123456', 'ajie')
# 使用cursor()方法创建一个游标对象cursor
cursor = conn.cursor()
# 使用预处理语句创建表
sql = 'create table t1(name char(255), height int, age int,sex char(255))'
# 执行SQL语句
cursor.execute(sql)
# 插入数据
import pymysql
# 打开数据库连接
conn = pymysql.connect('localhost', 'root', '123456', 'ajie')
# 使用cursor()方法获取操作游标
cursor = conn.cursor()
# SQL语句:向数据表中插入数据
sql = 'insert into t1(name,height,age,sex) values ( "阿杰" ,175,20,"男"); '
# 异常处理
try:
  # 执行SQL语句
  cursor.execute(sql)
  # 提交事务到数据库执行
  conn.commit()
except:
  # 如果发生错误则执行回滚操作
  conn.rollback()
# 关闭数据库连接
conn.close()
# 查询数据库
import pymysql
# 打开数据库连接
conn = pymysql.connect('localhost', 'root', '123456', )
# 使用cursor()方法获取操作游标
cursor = conn.cursor()
# SQL语句:查询
sql = "select * from ajie.t1; "
# 异常处理
try:
  # 执行SQL语句
  cursor.execute(sql)
  # 获取所有的记录列表
  results = cursor.fetchall()
  # 遍历列表
  for row in results:
      # 打印列表元素
        print(row)
except:
  print('Uable to fetch data!')
# 关闭数据库连接
conn.close()
# 更新数据
import pymysql
# 打开数据库连接
conn = pymysql.connect('localhost', 'root', '123456', 'ajie')
# 使用cursor()方法获取操作游标
cursor = conn.cursor()
# SQL语句,执行更新操作
sql = 'update t1 set age = age + 5 where sex = "男"'
# 异常处理
try:
  # 执行SQL语句
  cursor.execute(sql)
  # 提交到数据库执行
  conn.commit()
except:
  # 发生错误时回滚
  conn.rollback()
# 关闭数据库连接
conn.close()
# 删除数据
import pymysql
# 打开数据库连接
conn = pymysql.connect('localhost', 'root', '123456', 'ajie')
# 使用cursor()方法获取操作游标
cursor = conn.cursor()
# SQL语句,执行删除操作
sql = 'delete from t1 where age >20;'
# 异常处理
try:
  # 执行SQL语句
  cursor.execute(sql)
  # 提交到数据库执行
  conn.commit()
except:
  # 发生错误时回滚
  conn.rollback()
# 关闭数据库连接
conn.close()

python 信息收集

ip查询
import socket
ip = socket.gethostbyname("www.lvxinjie.cn")
print(ip)
whois 查询
from whois import whois
data = whois.whois("www.lvxinjie.cn")
print(data)
CDN判断
服务器: dns.google
Address: 8.8.8.8
名称:   www.lvxinjie.cn
Address: 120.25.205.228
import socket
import os
ports = ['21', '22', '80', '135', '443', '3306', '3389', '6375', '8080', '9000']
def netstat():
  ip = socket.gethostbyname(url)
  for port in ports:
      server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      result = server.connect_ex((ip, int(port)))
      if result == 0:
          print("%-14s:%-5s is open"%(ip, port))
      else:
          print("%-14s:%-5s is close"%(ip, port))
if __name__ == '__main__':
  # 判断是否有cdn
  url = input("请输入需要查询的域名:")
  url_cdn = os.popen("nslookup {}".format(url)).read()
  cdn = url_cdn.count(".")
  if cdn > 10:
      # 替换www 获取真实ip
      url = url.replace("www.", "")
      netstat()
  else:
      netstat()
子域名查询
# 利用字典记载爆破进行查询
def zym_list_check(url):
  url=url.replace("www.","")
  for zym_list in open("dic.txt"):
      zym_list=zym_list.replace("\n","")
      zym_list_url=zym_list+"."+url
      try:
          ip=socket.gethostbyname(zym_list_url)
          print(zym_list_url+"->"+ip)
          time.sleep(0.1)
      except Exception as e:
          print(zym_list_url+"->"+"error")
          time.sleep(0.1)
端口扫描
def port_check(url):
  ip = socket.gethostbyname(url)
  ports={'21','22','135','443','445','80','1433','3306',"3389",'1521','8000','7002','7001','8080',"9090",'8089',"4848}
  server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  for port in ports:
      try:
          data=server.connect_ex((ip, port))
          if data==0:
              print(ip+":"+str(port)+"|open")
          else:
              print(ip+":"+str(port)+"|close")
              pass
      except Exception as err:
              print("error")
nmap模块 内网主机探测
import nmap
def nmapscan():
  nm = nmap.PortScanner()
  try:
      data=nm.scan(hosts='192.168.18.0/24', arguments='-T4 -F')
      print(nm.all_hosts())
      print(nm.csv())
      print(data)
  except Exception as err:
      print("error")
if __name__ == '__main__':
  nmapscan()

高级端口扫描

import socket
import datetime
import re
from concurrent.futures import ThreadPoolExecutor, wait
DEBUG = False
# 判断ip地址输入是否符合规范
def check_ip(ipAddr):
  compile_ip = re.compile(
      '^(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9])\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)$')
  if compile_ip.match(ipAddr):
      return True
  else:
      return False
# 扫描端口程序
def portscan(ip, port):
  try:
      s = socket.socket()
      s.settimeout(0.2)
      s.connect((ip, port))
      openstr = f'[+] {ip} port:{port} open'
      print(openstr)
  except Exception as e:
      if DEBUG is True:
          print(ip + str(port) + str(e))
      else:
          return f'[+] {ip} port:{port} error'
  finally:
      s.close
# 主程序,利用ThreadPoolExecutor创建600个线程同时扫描端口
def main():
  while True:
      ip = input("请输入ip地址:")
      if check_ip(ip):
          start_time = datetime.datetime.now()
          executor = ThreadPoolExecutor(max_workers=600)
          t = [executor.submit(portscan, ip, n) for n in range(1, 65536)]
          if wait(t, return_when='ALL_COMPLETED'):
              end_time = datetime.datetime.now()
              print("扫描完成,用时:", (end_time - start_time).seconds)
              break
if __name__ == '__main__':
  main()

暴力破解FTP

import ftplib
import threading
import queue
#暴力破解ftp
def ftp_check():
  while not q.empty():
      dict = q.get()
      dict = dict.split('|')
      username = dict[0]
      password = dict[1]
      ftp = ftplib.FTP()
      try:
          ftp.connect(ip, port)
          ftp.login(username, password)
          ftp.close()
          print('用户名:{} 密码:{} 已成功破解!'.format(username,password))
      except ftplib.all_errors:
          ftp.close()
if __name__ == '__main__':
  ip = input("请输入连接IP:")
  port = int(input("请输入端 口:"))
  thread_x = input("请输入线程数:")
  q = queue.Queue()
  for username in open('user.txt'):
      for password in open('pwd.txt'):
          username = username.replace('\n', '')
          password = password.replace('\n', '')
          diclist = username + '|' + password
          q.put(diclist)
  for x in range(int(thread_x)):
      t = threading.Thread
      (target=ftp_check)
      t.start()


相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
相关文章
|
2月前
|
搜索推荐 Python
Leecode 101刷题笔记之第五章:和你一起你轻松刷题(Python)
这篇文章是关于LeetCode第101章的刷题笔记,涵盖了多种排序算法的Python实现和两个中等难度的编程练习题的解法。
23 3
|
2月前
|
存储 开发工具 Python
【Python项目】外星人入侵项目笔记
【Python项目】外星人入侵项目笔记
43 3
|
2月前
|
存储 Python
【免费分享编程笔记】Python学习笔记(二)
【免费分享编程笔记】Python学习笔记(二)
44 0
【免费分享编程笔记】Python学习笔记(二)
|
2月前
|
算法 C++ Python
Leecode 101刷题笔记之第四章:和你一起你轻松刷题(Python)
这篇博客是关于LeetCode上使用Python语言解决二分查找问题的刷题笔记,涵盖了从基础到进阶难度的多个题目及其解法。
18 0
|
2月前
|
算法 C++ Python
Leecode 101刷题笔记之第三章:和你一起你轻松刷题(Python)
本文是关于LeetCode算法题的刷题笔记,主要介绍了使用双指针技术解决的一系列算法问题,包括Two Sum II、Merge Sorted Array、Linked List Cycle II等,并提供了详细的题解和Python代码实现。
15 0
|
2月前
|
算法 C++ 索引
Leecode 101刷题笔记之第二章:和你一起你轻松刷题(Python)
本文是关于LeetCode 101刷题笔记的第二章,主要介绍了使用Python解决贪心算法题目的方法和实例。
11 0
|
2月前
|
并行计算 Python
Python错误笔记(一):CUDA initialization: CUDA unknown error - this may be due to an incorrectly set up env
这篇文章讨论了CUDA初始化时出现的未知错误及其解决方案,包括重启系统和安装nvidia-modprobe。
157 0
|
2月前
|
索引 Python
【免费分享编程笔记】Python学习笔记(一)
【免费分享编程笔记】Python学习笔记(一)
38 0
|
4月前
|
Python
【python】】Python 的 queue 模块使用笔记
【python】】Python 的 queue 模块使用笔记
45 0
|
4月前
|
Python
Python笔记9 类
本文是作者的Python复习笔记第九篇,深入探讨了Python中的类和面向对象编程。文中详细解释了如何创建类、实例化对象、定义和使用类方法,以及类的继承、重写方法和嵌套类的使用。此外,还讨论了类模块的导入和导出,包括处理类之间的依赖关系。通过示例代码,文章展示了类在Python编程中的应用和重要性。
29 0