Python灰帽编程——初识Python上
1. Python 简介
常用安全工具语言 | 示例 |
---|---|
perl | joomscan whatweb |
ruby | metasploit-framework |
python | sqlmap pocsuite3 |
go | goby |
1.1 Python 起源
1.1.1 语言的作者
贵铎·范·罗萨姆(Guido van Rossum)荷兰人于1989 年圣诞节始创了python。
- 大神就是大神,假期还写代码。
- 使用C 语言创建了Python。
1991 年初,python 发布了第一个公开发行版。
Python 很火
- 自动化运维
- 金融行业,数据分析
- 网络安全工具
- …
1.1.2 编程语言名字的由来
Monty Python 是英国的喜剧团队。
1.2 Pyhton 特点
特点 | 说明 |
---|---|
高级 | 有高级的数据结构,缩短开发时间与代码量 |
面向对象 | 为数据和逻辑相分离的结构化和过程化编程添加了新的活力 |
可升级 | 提供了基本的开发模块,可以在它上面开发软件,实现代码的重用 |
可扩展 | 通过将其分离为多个文件或模块加以组织管理 |
可移植性 | Python 是用C 写的,又由于C 的可移植性, 使得Python 可以运行在任何带有ANSI C 编译器的平台上 |
易学 | Python 关键字少、结构简单、语法清晰 |
易读 | 没有其他语言通常用来访问变量、定义代码块和进行模式匹配的命令式符号 |
内存管理器 | 内存管理是由python 解释器负责的 |
1.3 Python 版本
1.3.1 Python 官网
两个大版本:
- 3.x
- 2.x
1.3.2 CentOS7 下安装Python
下载安装包
此处以python3.7.3 为例进行源码包安装演示。可以到官网下载对应版本的源码包,并且能看到其md5 值。
计算md5 值
[root@localhost ~]# md5sum Desktop/Python-3.7.3.tgz
2ee10f25e3d1b14215d56c3882486fcf Desktop/Python-3.7.3.tgz
[root@localhost ~]#
安装开发环境
[root@localhost ~]# yum install gcc gcc-c++ zlib-devel bzip2-devel openssl-devel sqlite-devel readline-devel libffi-devel -y...Complete!
[root@localhost ~]#
1.3.2.1 编译安装
解压缩
[root@localhost ~]# tar xf Desktop/Python-3.7.3.tgz
修改配置
[root@localhost ~]# vim Python-3.7.3/Modules/Setup.dist
[root@localhost ~]# cat Python-3.7.3/Modules/Setup.dist |grep "^readline"
readline readline.c -lreadline -ltermcap # 开启代码补全
[root@localhost ~]# cat Python-3.7.3/Modules/Setup.dist |grep "^SSL=" -A3
SSL=/usr/local/ssl # 开启SSL 功能,使得Python 可以通过pip 使用https 协议
_ssl _ssl.c \-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \-L$(SSL)/lib -lssl -lcrypto
[root@localhost ~]#
编辑安装
[root@localhost ~]# ./Python-3.7.3/configure && make && make install...[root@localhost ~]# which python3
/usr/local/bin/python3
[root@localhost ~]#
1.3.2.2 安装测试
Python3
[root@localhost ~]# python3
Python 3.7.3 (default, Feb 13 2021, 14:04:11)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print("Hello,World")
Hello,World
>>> exit()
[root@localhost ~]#
Python2
[root@localhost ~]# python
Python 2.7.5 (default, Apr 11 2018, 07:36:10)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print "Hello,World"
Hello,World
>>> exit()
[root@localhost ~]#
1.3.2.3 配置pip3
配置更新源
[root@localhost ~]# mkdir ~/.pip
[root@localhost ~]# vim ~/.pip/pip.conf
[root@localhost ~]# cat ~/.pip/pip.conf
[global]
index-url=https://pypi.douban.com/simple
[root@localhost ~]#
验证下载
[root@localhost ~]# pip3 install bs4
Looking in indexes: https://pypi.douban.com/simple
Collecting bs4Downloading https://pypi.doubanio.com/packages/10/ed/7e8b97591f6f456174139ec089c769f89a94a1a4025fe967691de971f314/bs4-0.0.1.tar.gz
Collecting beautifulsoup4 (from bs4)Downloading https://pypi.doubanio.com/packages/d1/41/e6495bd7d3781cee623ce23ea6ac73282a373088fcd0ddc809a047b18eae/beautifulsoup4-4.9.3-py3-none-any.whl (115kB)100% |████████████████████████████████| 122kB 8.5MB/s
Collecting soupsieve>1.2; python_version >= "3.0" (from beautifulsoup4->bs4)Downloading https://pypi.doubanio.com/packages/41/e7/3617a4b988ed7744743fb0dbba5aa0a6e3f95a9557b43f8c4740d296b48a/soupsieve-2.2-py3-none-any.whl
Installing collected packages: soupsieve, beautifulsoup4, bs4Running setup.py install for bs4 ... done
Successfully installed beautifulsoup4-4.9.3 bs4-0.0.1 soupsieve-2.2
You are using pip version 19.0.3, however version 21.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
[root@localhost ~]#
1.3.3 Windows 下安装Python
1.3.3.1 软件包安装
Win7 下安装3.6.0。疯狂下一步即可,记着配置环境变量。Win10 可以安装更高版本,区别不是很大。
1.3.3.2 环境变量
1.3.3.3 配置pip 网络源
在当前用户家目录下新建文件夹pip
,并在该文件夹中新建文件pip.ini
,例如。
C:\Users\Administrator\pip\pip.ini
写入如下内容
[global]
timeout = 6000
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn
网络源测试
C:\Users\AJEST>pip install bs4
Collecting bs4Downloading https://pypi.tuna.tsinghua.edu.cn/packages/10/ed/7e8b97591f6f45617
4139ec089c769f89a94a1a4025fe967691de971f314/bs4-0.0.1.tar.gz
Collecting beautifulsoup4 (from bs4)Downloading https://pypi.tuna.tsinghua.edu.cn/packages/d1/41/e6495bd7d3781cee6
23ce23ea6ac73282a373088fcd0ddc809a047b18eae/beautifulsoup4-4.9.3-py3-none-any.wh
l (115kB)100% |████████████████████████████████| 122kB 6.6MB/s
Collecting soupsieve>1.2; python_version >= "3.0" (from beautifulsoup4->bs4)Downloading https://pypi.tuna.tsinghua.edu.cn/packages/41/e7/3617a4b988ed77447
43fb0dbba5aa0a6e3f95a9557b43f8c4740d296b48a/soupsieve-2.2-py3-none-any.whl
Installing collected packages: soupsieve, beautifulsoup4, bs4Running setup.py install for bs4 ... done
Successfully installed beautifulsoup4-4.9.3 bs4-0.0.1 soupsieve-2.2C:\Users\AJEST>
1.3.3.4开发工具
- vscode
- 自动安装插件
1.4 Python 的运行方法
1.4.1 命令行模式
直接在Python 解释器中运行Python 脚本。
1.4.2 文件模式
把Python 语句保存在文件(.py)中,然后运行py 文件。
指定命令解释器和文件编码:
#!/usr/bin/env python3
# coding:utf-8
自带编辑器IDLE
。
- 字体调整
- F5 运行脚本
命令行下
C:\Users\AJEST\Desktop>python first.py
Hello,World!
2. Python 初识
Python 语言官方参考
2.1 Python 语法结构
2.1.1 基本输出
# 01 - 基本输入输出.pyprint("My Name is xj")
2.1.2 注释
和大部分脚本及Unix-shell 语言一样,Python 也使用【# 符号】标示注释,从#
开始,直到一行结束的内容都是注释,良好的注释习惯可以:方便其他人了解程序功能方便以后易读懂代码
除了#
号以外,引号在python 中也同样作为注释使用如三个连续单引号以及连续3 个双引号,通常引号内的字符串作为文档说明使用。
# 02 - 注释.py'''这是注释
'''"""我是注释
"""print("I like Python!")
2.1.3 缩进
这是Python 语法与其他编程语言最大的区别。
Python 代码块通过缩进/对齐
表达代码逻辑,而不是使用大括号。缩进表达一个语句属于哪个代码块。缩进风格,空格:
- 1或2 空格:太短,很难确定代码语句属于哪个块;
- 8至10 空格:太长,如果代码内嵌的层次太多,就会使得代码很难阅读;
- 4 个空格:刚刚好,范·罗萨姆支持的风格。
2.1.4 续行
Alt+z
一行过长的语句可以使用反斜杠\
分解成几行。
# 03 - 续行.pyprint("I like Python very very very very very very very very ve\
ry very very very very very very very very very very very very v\
ery very very very very very very very very very very very very much")
使用+=
s = "I am very very very very very very very very very very "
s += "very very very very very very very very very very very "
s += "very very very very very very very very very very very "
s += "very very very very very very very very very very very "
s += "very very very very very very very very very very very "
s += "very very very very like Python"print(s)
2.1.5 同行多句
Python 推荐每条语句单独占一行,不推荐同行多句。可以使用分号;
将多个语句写在同一行上。
# 04 - 同行多句.py
# 不推荐此种写法a = 10;print(a)
2.2 Python 变量
根据用户的输入,获取用户名,然后输出欢迎信息。
2.2.1 变量定义
变量名称约定:
- 变量名由字母、数字、下划线组成,不是全都必须有;
- 不能以数字开头;
- 区分大小写。
序号 | 用户名 | 是否合法 |
---|---|---|
1 | username | |
2 | userName | |
3 | UserName | |
4 | username_1 | |
5 | _username_ | 合法,尽量避免定义类似变量 |
6 | userN@me | 不合法,包含特殊字符@ |
7 | 1userName | 不合法,数字开头 |
变量的使用过程
-
声明变量(变量名字、变量类型)
-
初始化(变量第一次赋值)
-
变量赋值和反复使用(赋值)
Python 是(动态类型语言)解释型脚本语言,不需要编译,即不需要预先声明变量的类型,拿过来就能用。
2.2.2 变量赋值
变量的类型和值在赋值那一刻被初始化,变量赋值通过赋值运算符=
来执行。
一个变量如果要使用,就给个值;如果不用,别让它出现。
# 05 - 变量赋值.pyusername = "xj"
# print("Welcome, " + username)
# print("Welcome, {1}".format(username))
print(f"Welcome, {username}")
Python 语言中,等号=
是主要的赋值运算符。赋值并不是直接将一个值赋给一个变量。在Python 中,对象是通过引用传递的。在赋值时,不管这个对象是新创建的,还是一个已经存在的,都是将该对象的引用(并不是值)赋值给变量。
赋值的多种玩法:
- 链式多重赋值
>>> x = y = 1
>>> y
1
>>> x
1
>>>
- **增量赋值:**从Python 2.0 开始,等号可以和一个算术运算符组合在一起,将计算结果重新赋值给左边的变量,这被称为增量赋值。
>>> x = 3
>>> x = x + 3
>>> x
6
>>> x = x + 3
>>> x
9
>>> x ++File "<stdin>", line 1x ++^
SyntaxError: invalid syntax #python中没有++
>>>
- **多元赋值:**将多个变量同时赋值的方法称为多元赋值,采用这种方式赋值时,等号两边的对象都是元组。
>>> x,y,z = 1,2,3
>>> y
2
>>>
2.2.3 捕获屏幕输入
根据用户的输入打印欢迎信息。等待用户输入
# 06 - 打印输出欢迎信息.pyusername = input("Please input your name: ")
print(f"Welcome, {username}")
命令行运行代码时 紧跟输入
import sys
username = sys.argv[1]
print(f"welcom,{username}!")
2.3 运算符
2.3.1 算术运算符
参与运算的操作数是数字,结果也是数字。
算数运算符 | 解释 |
---|---|
+ | * 如果操作数是字符类型,则字符串拼接 * 如果操作数是数字类型,则算术运算。 |
- | |
* | * 如果操作数是数字类型,则算数运算。 * 如果两个操作数其中一个是字符串类型,另一个是数字类型,则将字符串重复输出。 |
/ | |
% | 取余 |
// | 取商 |
** | 幂运算 |
>>> 10 + 3
13
>>> 10 - 3
7
>>> 10 * 3
30
>>> "AJEST" * 5
'AJESTAJESTAJESTAJESTAJEST'
>>> 10 / 3
3.3333333333333335
>>> 10 % 3
1
>>> 10 // 3
3
>>> 10 ** 3
1000
>>>
2.3.2 比较运算符
运算结果是布尔类型的值。运算结果是布尔类型的值,True | False。
比较运算符 | 运算结果 |
---|---|
< | |
<= | |
> | |
>= | |
== | |
!= |
>>> 10 < 3
False
>>> 10 <= 3
False
>>> 10 > 3
True
>>> 10 >= 3
True
>>> 10 == 3
False
>>> 10 != 3
True
>>>
2.3.3 逻辑运算符
参与运算的操作数是布尔类型的值,运算结果是布尔类型的值。
逻辑运算符 | 解释 | 字符表达 |
---|---|---|
and | 逻辑与运算 | & |
or | 逻辑或运算 | | |
not | 逻辑非运算 |
>>> True and False
False
>>> True or False
True
>>> not True
False
>>>
2.4 标识符
2.4.1 关键字
和其他的高级语言一样,Python 也拥有一些被称作关键字的保留字符。任何语言的关键字应该保持相对的稳定,但是因为Python 是一门不断成长和进化的语言,其关键字偶尔会更新。
通过keyword 模块查看关键字。
>>> import keyword
>>> keyword.iskeyword("pass")
True
>>> keyword.iskeyword("ajest")
False
>>> 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']
>>>
2.4.2 builtins
除了关键字之外,Python 还有可以在任何一级代码使用的“内建”的名字集合,这些名字可以由解释器设置或使用,内置函数就是在任何时候,任何地方都可以调用的函数。虽然built-in 不是关键字,但是应该把它当作“系统保留字”。
内置方法(函数),在任何地方都可以调用如下:
内置函数 | ||||
---|---|---|---|---|
abs() | delattr() | hash() | memoryview() | set() |
all() | dict() | help() | min() | setattr() |
any() | dir() | hex() | next() | slice() |
ascii() | divmod() | id() | object() | sorted() |
bin() | enumerate() | input() | oct() | staticmethod() |
bool() | eval() | int() | open() | str() |
breakpoint() | exec() | isinstance() | ord() | sum() |
bytearray() | filter() | issubclass() | pow() | super() |
bytes() | float() | iter() | print() | tuple() |
callable() | format() | len() | property() | type() |
chr() | frozenset() | list() | range() | vars() |
classmethod() | getattr() | locals() | repr() | zip() |
compile() | globals() | map() | reversed() | import() |
complex() | hasattr() | max() | round() |
保留的常量:
- True
- False
- None
2.5 基本风格
编写程序时,应该建立一种统一且容易阅读的结构,并将它应用到每一个文件中去。在Python 语言中:
{}
并不代表代码块
#!/usr/bin/env python3
# -*- coding:gbk -*- #起始行
'this is a test module' #模块文档字符串
import sys #导入模块
import os
debug = True #全局变量声明
class FooClass(object): #类定义'Foo class'pass
def test(): #函数定义"test function"foo = FooClass()
if __name__ == '__main__': #程序主体test()
3. Python 变量类型
3.1 对象
3.1.1 Python 对象特征
所有的Python 对象都拥有三个特性:
特性 | 说明 | 例子 |
---|---|---|
身份 | 每一个对象都有一个唯一的身份,标识自己, 任何对象的身份可以使用内建函数**id()**来得到 | id(username) |
类型 | 决定了该对象可以保存什么类型的值, 可以进行什么样的操作,以及遵循什么样的规则。 用内建函数type() 查看对象的类型 | type(username) |
值 | 对象表示的数据项 | print(username) |
3.1.2 Python 对象属性
某些Python 对象有属性、值或相关联的可执行代码,用点.
标记法来访问属性。最常用的属性是函数和方法,不过有一些Python 类型也有数据属性。含有数据属性的对象包括(但不限于):类、类实例、模块、复数和文件。
>>> username.
userName.capitalize( userName.isdigit( userName.rfind(
userName.casefold( userName.isidentifier( userName.rindex(
userName.center( userName.islower( userName.rjust(
userName.count( userName.isnumeric( userName.rpartition(
userName.encode( userName.isprintable( userName.rsplit(
userName.endswith( userName.isspace( userName.rstrip(
userName.expandtabs( userName.istitle( userName.split(
userName.find( userName.isupper( userName.splitlines(
userName.format( userName.join( userName.startswith(
userName.format_map( userName.ljust( userName.strip(
userName.index( userName.lower( userName.swapcase(
userName.isalnum( userName.lstrip( userName.title(
userName.isalpha( userName.maketrans( userName.translate(
userName.isascii( userName.partition( userName.upper(
userName.isdecimal( userName.replace( userName.zfill(
>>> username.lower()
'xj'
>>> userName
'XJ'
>>>
说明:少了右括号的需要参数,而括号完整的是不需要参数的。
3.1.3 对象身份比较
对象可以通过引用被赋值到另一个变量,因为每个变量都指向同一个(共享的)数据对象,只要任何一个引用发生改变,该对象的其它引用也会随之改变。
>>> x = 1
>>> y = x
>>> id(x)
4318726800
>>> id(y)
4318726800
>>>
3.2 数字
3.2.1 基本数字类型
关键字 | 解释 | 例子 |
---|---|---|
int | 有符号整数 | 自然数 |
bool boolean | 布尔值 | True:1 False:0 |
float | 浮点数 | π |
3.2.2 进制间的数字表示方式
Python 默认以十进制数显示,可以用其他方法表示数字:
进制 | 表达 | 实例 |
---|---|---|
10 进制 | 默认表达方式 | 11 |
2 进制 | 数字以0b 或0B 开头 | 0b11 |
8 进制 | 数字以0o 开头 | 0o11 |
16 进制 | 数字以0x 或0X 开头 | 0x11 |
>>> 11
11
>>> 0b11
3
>>> 0o11
9
>>> 0x11
17
>>>
3.2.3 位运算符
位运算符 | 功能 |
---|---|
num1 << num2 | num1 左移num2 位 |
num1 >> num2 | num1 右移num2 位 |
num1 & num2 | num1 与num2 按位与 |
num1 ^ num2 | num1 异或 num2 |
num1 | num2 | num1 与num2 按位或 |
~num | 单目运算,对数的每一位取反 |
>>> 2 >> 2
0
>>> 2 << 2
8
>>>
3.2.4 数字类型函数
函数 | 说明 |
---|---|
int() | 将字符串转化为数字 |
str() | 将数字转化为字符串 |
long() | |
float() | |
complex() | |
abs() | 返回给定参数的绝对值 |
divmod() | 内建函数把除法和取余运算结合起来,返回一个包含商和余数的元组 |
pow() | 进行指数运算 |
round() | 用于对浮点数进行四舍五入运算 |
3.2.5 仅用于整数的函数
函数 | 说明 |
---|---|
hex() | 10 进制数转换为字符串形式的16 进制数 |
oct() | 10 进制数转换为字符串形式的8 进制数 |
bin() | 10 进制数转换为字符串形式的2 进制数 |
>>> hex(11)
'0xb'
>>> oct(11)
'0o13'
>>> bin(11)
'0b1011'
>>>
3.3 字符串
3.3.1 字符串的定义
Python 中字符串被定义为引号之间的字符集合。Python 支持使用成对的单引号或双引号,无论单引号,还是双引号,表示的意义相同。Python 还支持三引号(三个连续的单引号或者双引号),可以用来包含特殊字符;Python 不区分字符和字符串。
# 07 - 字符串的定义.pyusername = 'xj'
username = "xj"
username = '''xj'''
username = """xj"""print(type(username))
3.3.2 字符串连接
字符串连接的时候可以使用+
或者*
。
使用+
号可以将多个字符串拼接在一起。或者使用*
号可以将一个字符串重复多次输出。
# 08 - 字符串拼接.pyusername = "xj"print("Welcome, " + username + '!')
print("Welcome, " + username * 5)
二狗子问题:
>>> 2 + 'dog'#报错了,报错内容如下
Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'#int型不能和str型进行运算>>> str(2) + 'dog'#将2转换为字符串和dog进行拼接
'2dog'
>>>
+
是双元运算符:算数运算符和拼接符
3.3.3 单个字符操作
单个字符操作 | 例子 |
---|---|
将字符转化成ASCII 码 | ord(‘a’) |
将ASCII 码转化位字符 | chr(97) |
3.3.4 字符串操作
序列:
角标访问
切片
成员关系
字符串操作 | 实例 |
---|---|
**比较运算符:**字符串按照字符的ASCII 码值进行比较。 | ‘b’ < ‘bool’ ‘b’ > ‘abcd’ |
**角标访问:**利用 偏离量获取字符串中的字符。 | ‘AJEST’[1] |
**切片:**取子串(包头不包尾,左闭右开区间) str[n:m],n,m 均代表偏移量,m > n,[n,m]:取从第n到第m-1字符 str[::n],每n 个字母一组,取第一个字母 str[::-1],字符串反向 str[::-2],字符串反向,两个字符一组,取第一个 | ‘AJEST’[1:3] ‘AJEST’[::3] ‘AJEST’[::-1] |
**成员关系:**字符串A 是否是字符串B 的子串 | ‘AJ’ in ‘AJEST’ ‘a’ not in ‘AJEST’ |
3.3.5 格式化操作符
格式化字符 | 转换方式 |
---|---|
%s | 字符串 |
%d | 10 进制数 |
%e | 科学计数法 “%e” %10000000000 |
%f | 浮点数 |
辅助指令 | 作用 |
数值 | 定义宽度或小数点精度,例如:%5s,%.3f |
- | 左对齐 |
+ | 正负数前面显示符号 “%+d” %-10 |
# 字符串格式化输出.pystudents = [{"name":"xj", "age":24}, {"name":"LL", "age":25}, {"name":"HMM", "age":23}]
print("name: %10s, age: %10d" % (students[0]["name"], students[0]["age"]))
print("name: %10s, age: %10d" % (students[1]["name"], students[1]["age"]))
print("name: %-10s, age: %-10d" % (students[2]["name"], students[2]["age"]))
3.3.6 format 格式化
Python2.6 开始,新增了一种格式化字符串的函数str.format()
,它增强了字符串格式化的功能。基本语法是通过{}
和 :
来代替以前的%
。format 函数可以接受不限个参数,位置可以不按顺序。
>>>"{} {}".format("hello", "world") # 不设置指定位置,按默认顺序
'hello world'>>> "{0} {1}".format("hello", "world") # 设置指定位置
'hello world'>>> "{1} {0} {1}".format("hello", "world") # 设置指定位置
'world hello world'
3.3.7 字符串常用内建函数
常用内建函数 | 说明 | 示例 |
---|---|---|
s.strip() | 删除字符串实例字符串两端的空白 | ’ AJEST '.strip() |
s.replace(sub,rep) | 搜索s 字符串中的sub, 并替换为rep | ‘ajest’.replace(‘e’,‘E’) |
s.split© | 分割字符串,并返回一个列表, 可以指定分隔符c,默认为空白。 | ‘127.0.0.1’.split(‘.’) |
s.center(width) | 返回一个原字符串居中, 并使用空格填充至长度width 的新字符串 | “AJEST”.center(11) |
s.upper() | 转换字符串实例中的小写字母为大写 | ‘ajest’.upper() |
s.lower() | 转换字符串实例中的大写字母为小写 | ‘AJEST’.lower() |
设IP:10.9.75.223\24取主机位
IP.find(“.”):第一个点的位置
IP.rfind(“.”):反向取第一个点的位置
IP[IP.rfind(“.”)+1:]:从右往左数第一个点的后一位到最后
IP.split(“.”):以点分割IP:[‘10’,‘9’,‘75’,‘223’]
IP.split(“.”)[3]:取主机位
3.4 列表
可以将列表当成普通的数组,它能保存任意数量任意类型的Python 对象。像字符串一样,列表也支持下标和切片操作;列表中的项目可以改变。
3.4.1 列表的定义
# 09 - 列表的定义.pystu1 = ["xj", True, 24, 59.9]
3.4.2 列表元素访问
通过下标(偏移量)访问数组元素。
# 10 - 列表元素的访问.pystu1 = ["xj", True, 24, 59.9]print(f"{stu1[0]} 的成绩是{stu1[3]}")stu1[3] += 0.1print(f"经过不断刻苦努力,{stu1[0]} 的成绩提高了0.1 分,为{stu1[3]}")
3.4.3 列表也是序列
由于列表也是序列类型,所以+
|*
| in
| not in
,都适用于列表,但是需要注意参与运算的对象属于同一类型。
>>> nsClass = ["xj", "LL", "HMM", "LH"]
>>> pyClass = ['MDM']
>>> nsClass += pyClass
>>> nsClass
['AJEST', 'LL', 'HMM', 'LH', 'MDM']
>>> "LH" in nsClass
True
>>>
3.4.4 作用于列表的函数
直接向函数中传参,参数为列表。
函数 | 说明 | 示例 |
---|---|---|
list() | 将序列转化成列表 | list(‘AJEST’) |
len() | 长度 | len(stu) |
max() | 最大值 | max(stu) |
min() | 最小值 | min(stu) |
sorted() | 排序 | sorted(stu) |
enumerate() | 取脚标和元素 | list(enumerate(stu)) |
3.4.5 列表内建函数
函数 | 说明 | 示例 |
---|---|---|
l.append(new) | 向列表中添加一个对象new | |
l.pop(obj) | 删除列表中的元素 | |
l.count(obj) | 返回一个对象obj 在列表中出现的次数 | |
l.index(obj) | obj 首次出现的位置 | |
l.insert(index,obj) | 在偏移量为index 的位置插入对象obj | |
l.reverse() | 翻转列表 | |
l.sort() | 排序 | |
l.extend(seq) | 把序列seq 的内容添加到列表中 |
>>> name = 'ajest'
>>> l = list(name)
>>> l
['a', 'j', 'e', 's', 't']
>>>
>>> l.append('a')
>>> l
['a', 'j', 'e', 's', 't', 'a']
>>>
>>> l.count('a')
2
>>>
>>> l.index('e')
2
>>>
>>> l.insert(0,'a')
>>> l
['a', 'a', 'j', 'e', 's', 't', 'a']
>>>
>>> l.reverse()
>>> l
['a', 't', 's', 'e', 'j', 'a', 'a']
>>>
>>> l.sort()
>>> l
['a', 'a', 'a', 'e', 'j', 's', 't']
>>>
>>> l.extend(name)
>>> l
['a', 'a', 'a', 'e', 'j', 's', 't', 'a', 'j', 'e', 's', 't']
>>>
3.4.6 多维列表
列表的元素也可以时列表
stu1 = ["xj",true,24,89.9]
stu2 = ["zs",true,23,96]
stu3 = ["gxx",true,24,95]
stu4 = ["rjc",false,24,88]
stu5 = ["jw",true,24,89]ns_class = [stu1,stu2,stu3,stu4,stu5]ns_class[1]
["xj",true,24,89.9]ns_class[1][3]
89.9
3.5 元组
3.5.1 元组定义
可以认为元组是静态的列表,元组一旦定义,不能改变。
列表是中括号,元组是小括号
>>> stu6 = ("lb", True, 24, 59.9)
>>> type(stu1)
<class 'tuple'>
>>> stu1[3]
59.9
>>> stu1[3] += 0.1
Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>>
3.5.2 成员关系判断
由于元组也是序列类型,所以作用在序列上的操作都可以作用于元组,通过in
、not in
判断成员关系
>>> 24 in stu1
True
>>>
3.5.3 单元素元组
如果一个元组中只有一个元素,那么创建该元组的时候,需要加上一个逗号。
>>> t = ("AJEST")
>>> type(t)
<class 'str'>
>>> t = ("AJEST",)
>>> type(t)
<class 'tuple'>
>>>
3.5.4 序列
字符串、列表、元组都是序列。
3.5.5 序列类型操作符
序列操作符 | 作用 |
---|---|
序列偏移量,脚标[n] | 获取脚标中的元素 |
序列切片,脚标[x:y] | 取脚标之间的值,y 的值不取 |
序列 * n | 重复输出n 次数 |
序列1 + 序列2 | 序列累加拼接 |
元素 in 序列 | 判断元素是否在字符串中 |
3.5.6 内建函数
函数 | 含义 |
---|---|
list(可迭代对象) | 转换为列表,可以将字符串转化为列表。 |
str(对象) | 将对象转换为字符串 |
tuple(可迭代对象) | 把可迭代对象转为元组 |
len(可迭代对象) | 返回对象长度 |
enumerate(可迭代对象) | 返回两个值一个脚标一个对应值 |
sorted(可迭代对象) | 对迭代对象排序,返回一个有序列表 |
reversed(可迭代对象) | 逆序迭代器 |
3.6字典
3.6.1 字典定义
字典是由键-值(key-value) 对
构成的映射数据类型,通过键取值,不支持下标操作。
>>> stu1 = {"name": 'AJEST', "sex": True, "age": 24, "score": 59.9}
>>> type(stu1)
<class 'dict'>
>>>
3.6.2 创建字典
出了可以通过{ }
操作符创建字典,还可以通过dict()
工厂方法创建字典或者通过fromkeys()
创建具有相同值的默认字典
>>> stu2 = dict((['name','LL'],['sex',True],['age',25],['score',69.9]))
>>> stu2
{'name': 'LL', 'sex': True, 'age': 25, 'score': 69.9}
>>> stu3 = {}.fromkeys(('name','sex','age','score'),24)
>>> stu3
{'name': 24, 'sex': 24, 'age': 24, 'score': 24}
>>>
3.6.3 访问字典
字典是映射类型,意味着它没有下标,有键值对,访问字典中的值需要使用相应的键。
>>> print(f"{stu1['name']} 的成绩是{stu1['score']}")
AJEST 的成绩是59.9
>>>
3.6.4 更新字典元素
通过键名更新字典键值:如果字典中有该键名,则更新对应的键值。如果字典中没有该键名,则向字典中添加键值对
>>> stu1['score'] += 0.1
>>> print(f"{stu1['name']} 的成绩是{stu1['score']}")
AJEST 的成绩是60.0
>>> stu1['e-mail'] = "2279913178@qq.com"#添加e-mail
>>> stu1
{'name': 'AJEST', 'sex': True, 'age': 24, 'score': 60.0, 'e-mail': '2279913178@qq.com'}
>>>
3.6.5 删除字典元素
使用pop()
方法可以“弹出”字典中的元素。
>>> stu1.pop("e-mail")
'2279913178@qq.com'
>>> stu1
{'name': 'xj', 'sex': True, 'age': 24, 'score': 60.0}
>>>
3.6.6 字典的内建方法
方法 | 说明 |
---|---|
d.copy() | 返回字典的一个副本 |
d.get(key) | 对字典dict 中的键key,返回它对应的值value, 如果字典中不存在此键,则返回default 的值 |
d.keys() | 返回一个包含字典中键的列表 |
d.values() | 返回一个包含字典中所有值的列表 |
d.update(dict2) | 将字典dict2 的键-值对添加到字典dict |
d.items() | 返回一个包含字典中(键,值)对元组的列表 |
>>> stu1.keys()
dict_keys(['name', 'sex', 'age', 'score'])
>>> stu1.values()
dict_values(['xj ', True, 24, 65.0])
>>>
4. 流程控制
4.1 条件分支
通过if 语句进行学生成绩判断。
4.1.1 单向条件分支
如果学生成绩大于等于60 分,则输出“恭喜”。
# 11 - 单向条件分支.pystu1 = {"name" : "xj","sex" : True,"age" : 24,"score" : 69.9
}if stu1['score'] >= 60 :print("Congratulations!")
4.1.2 双向条件分支
如果学生成绩大于等于60 分,则输出“恭喜”,否则输出“对不起!”。
# 12 - 双向条件分支.pystu1 = {"name" : "xj","sex" : True,"age" : 24,"score" : 59.9
}if stu1['score'] >= 60 :print("Congratulations!")else :print("Sorry! You may need help!")
4.1.3 多向条件分支
可以根据学生成绩进行定级:
- 如果学生成绩大于等于90 分,则定为A;
- 如果学生成绩大于等于80 分,则定为B;
- 如果学生成绩大于等于70 分,则定为C;
- 如果学生成绩大于等于60 分,则定为D;
- 如果学生成绩小于60 分,则定为不及格。
# 13 - 多向条件分支.pystu1 = {"name" : "xj","sex" : True,"age" : 24,"score" : 89.9
}if stu1['score'] >= 90 :print("A")elif stu1['score'] >= 80 :print("B")elif stu1['score'] >= 70 :print("C")elif stu1['score'] >= 60 :print("D")else :print("Sorry!")
4.1.4 if 判断条件探究
紧接着if 关键字后的条件判断语句为True
,则进入if 分支;否则进入else 分支。这里面判断语句的值大多数情况下,是非布尔类型变量。这种情况下,就会产生一个问题,什么样的表达式的值会被当做True
来看待,什么样的值会当做False
来看待。
基本原则:
- 大部分非布尔类型的变量都会被认为是True 值。
- 少部分非布尔类型的变量会被认为是False 值。
# 14 - if 判断条件探究.pyflag = True
flag = Falseflag = 0
flag = 0.0flag = ""
flag = []
flag = ()
flag = {}flag = Noneif flag :print(f"{flag} means True")else :print(f"{flag} means False")
4.2 循环结构
输出1 到100 所有的整数。
4.2.1 while 循环
当需要语句不断的重复执行时,可以使用while 循环。while 循环中语句块会连续不断的执行,直到表达式的值为False。
当满足的条件的时候,则执行循环体。
# 15 - while 循环.pyi = 0while i < 100 :i += 1print(i)
主要注意的问题:
- 死循环问题
- 计数器
4.2.2 for 循环
遍历,所有元素依次访问一遍。Python 中的for 接受可迭代对象(例如序列或迭代器)作为其参数,每次迭代其中一个元素。与while 循环一样,支持break、continue 语句。一般情况下,循环次数未知采用while 循环,循环次数已知(字符串,元组,列表,字典…),采用for 循环。
# 16 - for 循环.pyfor i in range(1, 101):print(i)
4.3 特殊流程控制语句
4.3.1 break 语句
break 结束当前循环,跳出循环体。
快速猜数字
:程序随机生成一个数字,用户输入数字,程序判断大小。
# 17 - 快速猜数字游戏.pyimport randomnumRand = random.choice(range(1, 101))while True:numIn = input("Please input a number: ")numIn = int(numIn)if numIn > numRand :print("猜大了")elif numIn < numRand :print("猜小了")else : print("猜对了")break
4.3.2 continue 语句
当触发continue 语句时,程序会忽略下方语句,回到循环的顶端继续循环,意味着本次循环“轮空”。
# 18 - continue 语句.pyfor i in range(1, 101):if i % 2 == 1 :continueprint(i)
``python
# 14 - if 判断条件探究.pyflag = True
flag = Falseflag = 0
flag = 0.0flag = ""
flag = []
flag = ()
flag = {}flag = Noneif flag :print(f"{flag} means True")else :print(f"{flag} means False")
4.2 循环结构
输出1 到100 所有的整数。
4.2.1 while 循环
当需要语句不断的重复执行时,可以使用while 循环。while 循环中语句块会连续不断的执行,直到表达式的值为False。
当满足的条件的时候,则执行循环体。
# 15 - while 循环.pyi = 0while i < 100 :i += 1print(i)
主要注意的问题:
- 死循环问题
- 计数器
4.2.2 for 循环
遍历,所有元素依次访问一遍。Python 中的for 接受可迭代对象(例如序列或迭代器)作为其参数,每次迭代其中一个元素。与while 循环一样,支持break、continue 语句。一般情况下,循环次数未知采用while 循环,循环次数已知(字符串,元组,列表,字典…),采用for 循环。
# 16 - for 循环.pyfor i in range(1, 101):print(i)
4.3 特殊流程控制语句
4.3.1 break 语句
break 结束当前循环,跳出循环体。
快速猜数字
:程序随机生成一个数字,用户输入数字,程序判断大小。
# 17 - 快速猜数字游戏.pyimport randomnumRand = random.choice(range(1, 101))while True:numIn = input("Please input a number: ")numIn = int(numIn)if numIn > numRand :print("猜大了")elif numIn < numRand :print("猜小了")else : print("猜对了")break
4.3.2 continue 语句
当触发continue 语句时,程序会忽略下方语句,回到循环的顶端继续循环,意味着本次循环“轮空”。
# 18 - continue 语句.pyfor i in range(1, 101):if i % 2 == 1 :continueprint(i)
相关文章:
Python灰帽编程——初识Python上
1. Python 简介 常用安全工具语言示例perljoomscan whatwebrubymetasploit-frameworkpythonsqlmap pocsuite3gogoby 1.1 Python 起源 1.1.1 语言的作者 贵铎范罗萨姆(Guido van Rossum)荷兰人于1989 年圣诞节始创了python。 大神就是大神࿰…...
OLED透明屏交互技术:开创未来科技的新篇章
OLED透明屏交互技术作为一项前沿的科技创新,正在以其高透明度、触摸和手势交互等特点,引领着未来科技的发展。 不仅在智能手机、可穿戴设备和汽车行业有着广泛应用,还在广告和展示领域展现出巨大的潜力。 那么,尼伽在这篇文章中将…...
揭秘Spring Boot内嵌Tomcat原理
tomcat 介绍 tomcat 是 web容器(servlet 容器),不管请求是访问静态资源HTML、JSP还是java接口,对tomcat而言,都是通过servlet访问: 访问静态资源,tomcat 会交由一个叫做DefaultServlet的类来处…...
分类散点图 stripplot() 加辅助线axhline() 多图合一
分类散点图 stripplot 加辅助线axhline 多图合一 效果图代码 画图没有什么可说的,直接上图 效果图 代码 # 绘制图, 查看是否数值在阈值上 plt.figure(figsize(30, 18)) n 0 for header, value_list in info_dict.items():ref_value_list ref_info_dic…...
一文告诉你为什么时序场景下 TDengine 数据订阅比 Kafka 好
在 TDengine 3.0 中,我们对流式计算、数据订阅功能都进行了再升级,帮助用户极大简化了数据架构的复杂程度,降低整体运维成本。TDengine 提供的类似消息队列产品的数据订阅、消费接口,本质上是为了帮助应用实时获取写入 TDengine 的…...
reg与wire的用法,证明reg可以在右边,wire型在左边,来作组合逻辑处理。
reg与wire的用法,证明reg可以在右边,wire型在左边,来作组合逻辑处理。 1,RTL2,生成的原理图 1,RTL 参考文献: 1,verilog 中 wire 和reg 的使用 2,解决一个assign问题&…...
Studio One6.2简体中文免费最新版本宿主软件
对于一些有创作需求的朋友来说,为自己写的歌制作伴奏是很平常的。今天要和大家分享的就是自己写的歌怎么做伴奏,自己做伴奏的软件有哪些。Studio One是宿主软件界的一个后起之秀,推出的时间不久,但是受到了大量音乐制作人的推崇。…...
算法刷题 week2
目录 week21. 二维数组中的查找题目题解(单调性扫描) O(nm) 2.替换空格题目题解(线性扫描) O(n)(双指针扫描) O(n) 3.从尾到头打印链表题目题解(遍历链表) O(n) week2 1. 二维数组中的查找 题目 题解 (单调性扫描) O(nm) 核心在于发现每个子矩阵右上角的数的性质࿱…...
子网的划分
强化计算机网络发现王道没有这一块的内容,导致做题稀里糊涂。于是个人调研补充。 子网划分是将一个大型IP网络划分成更小的子网,以实现更有效的网络管理和资源分配。 原因: 提高网络性能:子网划分可以减少广播域的大小ÿ…...
Docker安装与卸载
Docker安装与卸载 安装 yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken更新本地镜像源 打开终端或 SSH 连接到 Rocky Linux 的服务器。 进入 /etc/yum.repos.d/ 目录,该目录包含 Rocky Linux 的 yum 配置文件。 cd /etc/yum.repo…...
【Davinci开发】:开发过程问题记录及总结
开发过程问题总结 1、SWC访问系统OS Timer返回值异常a、代码发现,RTE接口为未连接状态b、连接后,仍然有问题,单步调试,发现没有访问权限当新平台基于之前平台的代码而延续开发时(应用代码相同,但是芯片已经更换),记录开发过程中遇所到的问题,单步调试,逐一排查。 1、…...
数据结构——排序算法——冒泡排序
冒泡排序1 void swap(vector<int> arr, int i, int j) {int temp arr[i];arr[i] arr[j];arr[j] temp;}void bubbleSort1(vector<int> arr) {for (int i 0; i < arr.size() - 1; i){for (int j 0; j < arr.size() - 1 - i; j){if (arr[j] > arr[j 1…...
vscode使用
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:…...
python经典百题之求前!的和
题目:求12!3!…20!的和 方法一: 使用for循环和阶乘函数计算每项的值,再将每项的值累加起来。 def factorial(n):if n 0:return 1else:return n * factorial(n-1)sum 0 for i in range(1, 21):sum factorial(i) * iprint(sum)优点&#…...
C语言入门Day_22 初识指针
目录 前言: 1.内存地址 2.指针的定义 3.指针的使用 4.易错点 5.思维导图 前言: 之前我们学过变量可以用来存储数据,就像一个盒子里面可以放不同的球一样。 这是一个方便大家理解专业概念的比喻。 在计算机世界里面,数据实…...
【面试必刷TOP101】删除链表的倒数第n个节点 两个链表的第一个公共结点
目录 题目:删除链表的倒数第n个节点_牛客题霸_牛客网 (nowcoder.com) 题目的接口: 解题思路: 代码: 过啦!!! 题目:两个链表的第一个公共结点_牛客题霸_牛客网 (nowcoder.com) …...
手刻 Deep Learning -第壹章 -PyTorch教学-激励函数与感知机入门(上)
一、前言 本文接续前篇教学 Pytorch 与线性回归 ,本文着重在 Activation Function ( 中文称 激励函数 ),我们会介绍激励函数 (也有人称 激活函数? 激发函数? ) 为什么会有用…...
物理内存分配
目录 内核物理内存分配接口 内存分配行为(物理上) 内存分配的行为操作 内存 三个水位线 水线计算 水位线影响内存分配行为 内存分配核心__alloc_pages 释放页 1、内核物理内存分配接口 struct page *alloc_pages(gfp_t gfp, unsigned int ord…...
RFID产线自动化升级改造管理方案
应用背景 在现代制造业中,产线管理是实现高效生产和优质产品的关键环节,产线管理涉及到生产过程的监控、物料管理、工艺控制、质量追溯等多个方面,有效的产线管理可以提高生产效率、降低成本、改善产品质量,并满足市场需求的变化…...
全量数据采集:不同网站的方法与挑战
简介 在当今数字化时代中,有数据就能方便我们做出很多决策。数据的获取与分析已经成为学术研究、商业分析、战略决策以及个人好奇心的关键驱动力。本文将分享不同网站的全量数据采集方法,以及在这一过程中可能会遇到的挑战。 部分全量采集方法 1. 撞店…...
Redis——渐进式遍历和数据库管理命令
介绍 如果使用keys * 这样的操作,将Redis中所有的key都获取到,由于Redis是单线程工作,这个操作本身又要消耗很多时间,那么就会导致Redis服务器阻塞,后续的操作无法正常执行 而渐进式遍历,通过多次执行遍历…...
如何打造可视化警务巡防通信解决方案
近年来,科学技术飞速发展,给予了犯罪分子可乘之机。当面临专业化的犯罪分子、高科技的犯罪手段,传统警务模式似乎不能满足警方打击犯罪的需要,因此当今公安工作迫切需要构建智能化、系统化、信息化的警务通信管理模式。 警务人员…...
ATF(TF-A) SPMC威胁模型-安全检测与评估
安全之安全(security)博客目录导读 ATF(TF-A) 威胁模型汇总 目录 一、简介 二、评估目标 1、数据流图 三、威胁分析 1、信任边界 2、资产 3、威胁代理 4、威胁类型 5、威胁评估 5.1 端点在直接请求/响应调用中模拟发送方或接收方FF-A ID 5.2 篡改端点和SPMC之间的…...
BIO AIO NIO 的区别
BIO AIO NIO 是 Java 中用于 I/O 操作的三种不同的编程模型。它们的区别在于它们执行I/O 操作的方式和效率。在讲 BIO,NIO,AIO 之前先来回顾一下这样几个概念:同步与异步,阻塞与非阻塞。 同步与异步 同步:同步就是发起一个调用后ÿ…...
大数据学习1.1-Centos8网络配置
1.查看虚拟网卡 2.配置网络信息 打勾处取消 记住箭头的数字 3.修改 网络连接 4.进入虚拟网络 5.进入属性 6.修改IPv4 5.将iIP和DNS进行修改 6.配置网络信息-进入修改网络配置文件 # 进入root用户 su root # 进入网络配置文件 cd /etc/sysconfig/network-scripts/ # 修改网络配…...
在Android studio 创建Flutter项目运行出现问题总结
在Android studio 中配置Flutter出现的问题 A problem occurred configuring root project ‘android’出现这个问题。解决办法 首先找到flutter配置的位置 在D:\xxx\flutter\packages\flutter_tools\gradle位置中的flutter.gradle buildscript { repositories { googl…...
Ceph入门到精通-ceph对于长文件名如何处理
RADOS object with short name 上一篇博文,我们将介绍了对象相关的数据结构ghobject_t,以及对象在底层文件系统存储的文件名,以及如何从文件名对应到 ghobject_t对象。 映射关系如下图所示: 这里面有一个漏洞,即obje…...
vue+element-ui 项目实战示例详解【目录】
vue 和 element是两个流行的前端即时,通常用于管理后台,PC等页面 能够快速构建美观的界面 1. vue2 介绍 Vue.js是一个流行的JavaScript框架,用于构建用户界面。它的版本分为Vue 2和Vue 3,而Element是一个基于Vue.js 2的UI组件库。…...
性能测试-性能调优主要方向和原则(15)
性能调优主要方向明确性能瓶颈之后,就需要进行性能调优了,调优主要从图所示的多个方向入手。能优化手段并不一定是独立应用的,在一次优化过程中很可能应用了多种优化技巧。 硬件层面优化 硬件层面优化更偏向于监控,当定位到硬件资源成为瓶颈后,更多是采用扩容等手段来解决…...
关于taos数据库使用过程中突发“unable to establish connection”问题解决
项目使用的版本信息 1.taos的版本信息 3.0.4.1 2.jdbc的版本 3.2.1 3.druid连接池版本 1.2.11问题描述 Java应用服务连接,突然大量抛出如下的异常信息导致应用宕机: sql: select server_status(), desc: unable to establish connection和集团DBA沟通…...
天津网站建设 文率科技/怎么弄推广广告
0. 前言 听了实验室6位老师的讲座之后,对老师们的研究内容有了基本的认识。下面将对这6次的内容做个总结。 1. 主动学习 主动学习方法,是指能够从任务出发,通过对任务的理解来制定标准,挑选最关键的样本,使其最有助于…...
织梦cms 做视频网站/深圳产品网络推广
项目引入vue-i18n实现国际化多语言,vue-i18n包 自行下载,放到libs目录下,在main.js中引入 //main.js import Vue from vue import App from ./App //多语言引入 import VueI18n from ./libs/vue-i18n import en from ./common/js/en.js//英文…...
兰州城关区建设局网站/佛山seo
单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: 214…...
网站开发需会的课程/青岛网站建设公司电话
4.1 开发完第一个鸿蒙应用后,下面在了解一下完整的鸿蒙应用打包发布后应该是什么样子:一个完整的打包后应用结构如下图所示,这里我们先了解结构,具体怎么打包很简单只要前提是要签名!1. HAP的分类HAP又可分为entry和feature两种模…...
网站建设的空间选择/手机端seo
为什么阿里巴巴的持久层抛弃hibernate,采用MyBatis框架? 原因大概有以下4点: 尤其是需要处理大量数据或者大并发情况的网站服务,这也阿里选择MyBatis的原因。 MyBatis整体架构 不多讲,先看目录图 MyBatis源码笔记文档…...
做暧暧视频网站免费/怎么自己刷推广链接
自20年前TIOBE指数开始以来,Java和C首次不再占据前两位。 C仍然是第一,但现在是Python占据了第二的位置。有人说,Python最近的流行是由于数据挖掘、人工智能和数值计算等领域的蓬勃发展,但我有自己的看法。我相信Python的流行与一般需求有关…...