Python灰帽编程——初识Python上

1. Python 简介

常用安全工具语言示例
perljoomscan whatweb
rubymetasploit-framework
pythonsqlmap pocsuite3
gogoby

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 官网

image-20230911103505094

两个大版本:

  • 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 可以安装更高版本,区别不是很大。

image-20230911103600490

1.3.3.2 环境变量

image-20230911103707126

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 脚本。

image-20230911103851906

1.4.2 文件模式

把Python 语句保存在文件(.py)中,然后运行py 文件。

指定命令解释器和文件编码:

#!/usr/bin/env python3
# coding:utf-8

自带编辑器IDLE

  • 字体调整
  • F5 运行脚本

img

命令行下

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!")

image-20230911140505859

2.1.3 缩进

这是Python 语法与其他编程语言最大的区别。

Python 代码块通过缩进/对齐表达代码逻辑,而不是使用大括号。缩进表达一个语句属于哪个代码块。缩进风格,空格:

  • 1或2 空格:太短,很难确定代码语句属于哪个块;
  • 8至10 空格:太长,如果代码内嵌的层次太多,就会使得代码很难阅读;
  • 4 个空格:刚刚好,范·罗萨姆支持的风格。

2.1.4 续行

image-20230911105909438

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)

image-20230911151341958

2.1.5 同行多句

Python 推荐每条语句单独占一行,不推荐同行多句。可以使用分号; 将多个语句写在同一行上。

# 04 - 同行多句.py
# 不推荐此种写法a = 10;print(a)

2.2 Python 变量

根据用户的输入,获取用户名,然后输出欢迎信息。

2.2.1 变量定义

变量名称约定:

  • 变量名由字母、数字、下划线组成,不是全都必须有;
  • 不能以数字开头;
  • 区分大小写。
序号用户名是否合法
1username
2userName
3UserName
4username_1
5_username_合法,尽量避免定义类似变量
6userN@me不合法,包含特殊字符@
71userName不合法,数字开头

变量的使用过程

  • 声明变量(变量名字、变量类型)

  • 初始化(变量第一次赋值)

  • 变量赋值和反复使用(赋值)

Python 是(动态类型语言)解释型脚本语言,不需要编译,即不需要预先声明变量的类型,拿过来就能用。

2.2.2 变量赋值

变量的类型和值在赋值那一刻被初始化,变量赋值通过赋值运算符= 来执行。

一个变量如果要使用,就给个值;如果不用,别让它出现。

# 05 - 变量赋值.pyusername = "xj"
# print("Welcome, " + username)
# print("Welcome, {1}".format(username))
print(f"Welcome, {username}")

image-20230911153135834

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}")

image-20230911164439021

命令行运行代码时 紧跟输入

import sys
username = sys.argv[1]
print(f"welcom,{username}!")

image-20230911164214707

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 << num2num1 左移num2 位
num1 >> num2num1 右移num2 位
num1 & num2num1 与num2 按位与
num1 ^ num2num1 异或 num2
num1 | num2num1 与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字符串
%d10 进制数
%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 成员关系判断

由于元组也是序列类型,所以作用在序列上的操作都可以作用于元组,通过innot 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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/107737.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis中当实体类中的属性名和表中的字段名不一样,怎么办

方法1&#xff1a; 在mybatis核心配置文件中指定&#xff0c;springboot加载mybatis核心配置文件 springboot项目的一个特点就是0配置&#xff0c;本来就省掉了mybatis的核心配置文件&#xff0c;现在又加回去算什么事&#xff0c;总之这种方式可行但没人这样用 具体操作&…

[每周一更]-(第62期):SRE 是什么?

在公司Devops平台搭建&#xff0c;采用了JenkinsGitGitlabDocker&#xff0c;进行了自动化构建和部署代码&#xff0c;解放了繁杂的代码更改到test/prod环境的问题&#xff1b; 这部分更多是运维比例极大&#xff0c;少量的开发操作&#xff0c;基本都是配置命令行以及yml配置、…

JDK20 + SpringBoot 3.1.0 + JdbcTemplate 使用

JDK20 SpringBoot 3.1.0 JdbcTemplate 使用 一.测试数据库 Postgres二.SpringBoot项目1.Pom 依赖2.配置文件3.启动类4.数据源配置类5.实体对象类包装类6.测试用实体对象1.基类2.扩展类 7.测试类 通过 JdbcTemplate 直接执行 SQL 语句&#xff0c;结合源码动态编译即可方便实现…

模型解释方法

模型生成后需要对模型进行解释 特征权重 importances rfc.feature_importances_ indices np.argsort(importances)[::-1] #[::-1]表示将各指标按权重大小进行排序输出 for f in range(data_train_x[:100].shape[1]):print("%2d) %-*s %f" % (f 1, 30, data_trai…

算法训练营day46|动态规划 part08:完全背包 (LeetCode 139. 单词拆分、多重背包理论基础)

文章目录 139. 单词拆分 (求排列方法)回溯思路分析背包思路分析代码实现思考总结 多重背包理论基础 139. 单词拆分 (求排列方法) 题目链接&#x1f525;&#x1f525; 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict&#xff0c;判定 s 是否可以被空格拆分为一个或多…

docker 方式安装mysql 主从方式keepalived实现高可用

一、环境介绍 二、MySQL安装 在两台服务器上都安装mysql 1、拉取镜像 docker pull mysql:8.0.272、创建挂载目录 mkdir -p /data/mysql/3、运行容器 主节点 docker run \--restartalways \--name master_mysql -p 3306:3306 \-e MYSQL_ROOT_PASSWORD123456 -d \-v /data/m…

用户权限数据转换为用户组列表(3/3) - Excel PY公式

最近Excel圈里的大事情就是微软把PY塞进了Excel单元格&#xff0c;可以作为公式使用&#xff0c;轻松用PY做数据分析。系好安全带&#xff0c;老司机带你玩一把。 实例需求&#xff1a;如下是AD用户的列表,每个用户拥有该应用程序的只读或读写权限&#xff0c;现在需要创建新的…

SpringMVC笔记

文章目录 一、SpringMVC简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点 二、HelloWorld1、开发环境2、创建maven工程a>添加web模块b>打包方式&#xff1a;warc>引入依赖 3、配置web.xmla>默认配置方式b>扩展配置方式 4、创建请求控制器5、创建springMVC…

面试:如何实现分布式锁?看清楚,不是实现分布式事务!!

面试复盘&#xff1a;如何实现分布式锁&#xff1f; 目录 面试复盘&#xff1a;如何实现分布式锁&#xff1f; 1.分布式锁要求 2.实现方案 3.数据库分布式锁 3.1 悲观锁 3.2 乐观锁 4.Zookeeper 分布式锁 4.1 引入 Curator 和 ZooKeeper 4.2 配置 ZooKeeper 连接 4.3 编…

【送书活动】畅销书《Kali Linux高级渗透测试》更新版速速查收~

文章目录 每日一句正能量前言本书概况读者对象赠书活动目录 每日一句正能量 其实&#xff0c;人生很多东西无所谓最好的&#xff0c;只要你认为值得就是最好。 前言 对于企业网络安全建设工作的质量保障&#xff0c;业界普遍遵循PDCA&#xff08;计划&#xff08;Plan&#xf…

SAP HANA 体系结构,LandScape,规模调整:完整教程

目录 一、SAP HANA 体系结构 二、SAP HANA 景观 三、SAP HANA 大小调整 SAP HANA 数据库是以主内存为中心的数据管理平台。 SAP HANA 数据库在 SUSE Linux Enterprises Server 上运行&#xff0c;并基于 C 语言构建。 SAP HANA 数据库可以分发到多台计算机。 SAP HANA 的优…

SpringBoot-可视化监控

一、添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--采集应用的指标信息&#xff0c;prometheus--> <dependency…