Python灰帽编程——初识Python上

news2024/12/23 8:30:25

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 bs4
  Downloading 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, bs4
  Running 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 bs4
  Downloading 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, bs4
  Running setup.py install for bs4 ... done
Successfully installed beautifulsoup4-4.9.3 bs4-0.0.1 soupsieve-2.2

C:\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 - 基本输入输出.py

print("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 - 续行.py

print("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 - 变量赋值.py

username = "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 1
    x ++
       ^
SyntaxError: invalid syntax #python中没有++
>>>
  • **多元赋值:**将多个变量同时赋值的方法称为多元赋值,采用这种方式赋值时,等号两边的对象都是元组。
>>> x,y,z = 1,2,3
>>> y
2
>>>

2.2.3 捕获屏幕输入

根据用户的输入打印欢迎信息。等待用户输入

# 06 - 打印输出欢迎信息.py

username = 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 - 字符串的定义.py

username = 'xj'
username = "xj"
username = '''xj'''
username = """xj"""

print(type(username))

3.3.2 字符串连接

字符串连接的时候可以使用+ 或者*

使用+号可以将多个字符串拼接在一起。或者使用* 号可以将一个字符串重复多次输出。

# 08 - 字符串拼接.py

username = "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
# 字符串格式化输出.py

students = [
    {"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 - 列表的定义.py

stu1 = ["xj", True, 24, 59.9]

3.4.2 列表元素访问

通过下标(偏移量)访问数组元素。

# 10 - 列表元素的访问.py

stu1 = ["xj", True, 24, 59.9]

print(f"{stu1[0]} 的成绩是{stu1[3]}")

stu1[3] += 0.1

print(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 - 单向条件分支.py

stu1 = {
    "name"  :   "xj",
    "sex"   :   True,
    "age"   :   24,
    "score" :   69.9
}

if stu1['score'] >= 60 :
    print("Congratulations!")

4.1.2 双向条件分支

如果学生成绩大于等于60 分,则输出“恭喜”,否则输出“对不起!”。

# 12 - 双向条件分支.py

stu1 = {
    "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 - 多向条件分支.py

stu1 = {
    "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 判断条件探究.py

flag = True
flag = False

flag = 0
flag = 0.0

flag = ""
flag = []
flag = ()
flag = {}

flag = None

if 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 循环.py

i = 0

while i < 100 :
    i += 1
    print(i)

主要注意的问题:

  • 死循环问题
  • 计数器

4.2.2 for 循环

遍历,所有元素依次访问一遍。Python 中的for 接受可迭代对象(例如序列或迭代器)作为其参数,每次迭代其中一个元素。与while 循环一样,支持break、continue 语句。一般情况下,循环次数未知采用while 循环,循环次数已知(字符串,元组,列表,字典…),采用for 循环。

# 16 - for 循环.py

for i in range(1, 101):
    print(i)

4.3 特殊流程控制语句

4.3.1 break 语句

break 结束当前循环,跳出循环体。

快速猜数字:程序随机生成一个数字,用户输入数字,程序判断大小。

# 17 - 快速猜数字游戏.py

import random

numRand = 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 语句.py

for i in range(1, 101):
    if i % 2 == 1 :
        continue
    print(i)
``python
# 14 - if 判断条件探究.py

flag = True
flag = False

flag = 0
flag = 0.0

flag = ""
flag = []
flag = ()
flag = {}

flag = None

if 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 循环.py

i = 0

while i < 100 :
    i += 1
    print(i)

主要注意的问题:

  • 死循环问题
  • 计数器

4.2.2 for 循环

遍历,所有元素依次访问一遍。Python 中的for 接受可迭代对象(例如序列或迭代器)作为其参数,每次迭代其中一个元素。与while 循环一样,支持break、continue 语句。一般情况下,循环次数未知采用while 循环,循环次数已知(字符串,元组,列表,字典…),采用for 循环。

# 16 - for 循环.py

for i in range(1, 101):
    print(i)

4.3 特殊流程控制语句

4.3.1 break 语句

break 结束当前循环,跳出循环体。

快速猜数字:程序随机生成一个数字,用户输入数字,程序判断大小。

# 17 - 快速猜数字游戏.py

import random

numRand = 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 语句.py

for i in range(1, 101):
    if i % 2 == 1 :
        continue
    print(i)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TypeScript 类

类在面向对象编程中起着创建对象的蓝图&#xff0c;描述所创建的对象共同的属性和方法的作用。 创建类 与JS差不多&#xff0c;通过 Class 关键字来定义一个类&#xff1a; class Greeter {// 静态属性static cname: string "Greeter";// 成员属性greeting: strin…

音乐格式转换mp3怎么转?跟着步骤操作一遍

音乐格式转换mp3怎么转&#xff1f;mp3&#xff0c;一种音频数据压缩格式&#xff0c;由于其极具优势的文件尺寸小和高质量音效&#xff0c;自诞生之日起就占据了主流音乐格式的头把交椅&#xff0c;并且至今仍然受到用户的青睐&#xff0c;稳居音乐领域的霸主地位。在我们繁忙…

Postman接口压力测试 ---- Tests使用(断言)

所谓断言&#xff0c;主要用于测试返回的数据结果进行匹配判断&#xff0c;匹配成功返回PASS&#xff0c;失败返回FAIL。 下图方法一&#xff0c;直接点击右侧例子函数&#xff0c;会自动生成出现在左侧窗口脚本&#xff0c;只需修改数据即可。 方法二&#xff1a;直接自己写脚…

前端实现页面通过canvas添加全屏水印

写在前面&#xff0c;博主是个在北京打拼的码农&#xff0c;从事前端工作5年了&#xff0c;做过十多个大大小小不同类型的项目&#xff0c;最近心血来潮在这儿写点东西&#xff0c;欢迎大家多多指教。 对于文章中出现的任何错误请大家批评指出&#xff0c;一定及时修改。有任何…

【STM32】片上ADC的初步使用

基于stm32f103系列 基于《零死角玩转 STM32F103—指南者》 ADC简介 stm32f103上的ADC 数量&#xff1a;3 精度:12bit(4096) 通道&#xff1a;ADC1&#xff0c;ADC2均有16个通道&#xff0c;ADC3有8个 功能:   转换结束、注入转换结束和发生模拟看门狗事件时产生中断。   …

Git入门图文教程(深入浅出,详细了解Git,以及操作)

01、认识一下Git&#xff01;—简介 Git是当前最先进、最主流的分布式版本控制系统&#xff0c;免费、开源&#xff01;核心能力就是版本控制。再具体一点&#xff0c;就是面向代码文件的版本控制&#xff0c;代码的任何修改历史都会被记录管理起来&#xff0c;意味着可以恢复…

HCS 中的一些概念

一、HCS功能层 1、基础设施&#xff1a;服务器、存储、网络、防火墙…… 2、资源池&#xff1a;Fusion Sphere OpenStack资源池、虚拟化资源池、裸金属服务器池、块存储池、文件存储池、网络资源池灾备资源池…… 3、管理域&#xff1a;ManageOne提供多个数据中心的统一管理和调…

解决:华为ensp软件中AR和AC,AP设备无法启动报错“40”的问题

AR为路由器设备&#xff0c;AC&#xff0c;AP为无线局域网设备。 报错信息 报错原因以及解决方案&#xff1a; 1.系统虚拟化hyper-v正在运行 计算机安装过virtualBox,Vmvere之类的虚拟化软件&#xff0c;默认系统虚拟化安全性属于运行状态。 解决方案&#xff1a; 1.搜索cm…

数字展厅是什么,数字展厅有哪些优势?

引言&#xff1a; 随着数字化时代的到来&#xff0c;宣传领域也发生了巨大的变革。数字展厅是一种全新的宣传工具&#xff0c;正在逐渐崭露头角&#xff0c;作为现代宣传领域的一项重要创新&#xff0c;在迅速改变传统展厅的面貌。 一&#xff0e;什么是数字展厅&#xff1f; …

LinkedHashMap源码分析

特性 在 HashMap 基础上维护一条双向链表 支持遍历时会按照插入顺序有序进行迭代。LinkedHashMap 的迭代顺序是和插入顺序一致的,这一点是 HashMap 所不具备的。 。支持按照元素访问顺序排序,适用于封装 LRU 缓存工具。 因为内部使用双向链表维护各个节点&#xff0c;所以遍历…

北峰北斗短报文在应急通信的应用

随着社会的发展&#xff0c;自然灾害、交通事故等突发事件的频繁发生&#xff0c;让人们知道通信设备的可靠性尤为重要。北斗短报文应急通信作为一种新型的通信方式&#xff0c;具有较高的可靠性和应用价值。尤其是在灾区移动通讯中断&#xff0c;电力中断或移动通信无法覆盖北…

React 之 Hooks解析

一、概念 1. class组件的优势 class组件可以定义自己的state&#xff0c;用来保存组件自己内部的状态 函数式组件不可以&#xff0c;因为函数每次调用都会产生新的临时变量class组件有自己的生命周期&#xff0c;我们可以在对应的生命周期中完成自己的逻辑&#xff0c;比如在…

使用Postman拦截浏览器请求

项目上线之后&#xff0c;难免会有BUG。在出现问题的时候&#xff0c;我们可能需要获取前端页面发送请求的数据&#xff0c;然后在测试环境发送相同的数据将问题复现。手动构建数据是挺麻烦的一件事&#xff0c;所以我们可以借助Postman在浏览器上的插件帮助拦截请求&#xff0…

2023最新PDF阅读器评测

评测说明 本人程序员&#xff0c;平时阅读为主。以下为主观实际体验感受为主。 软件选择 以无广、可免费使用为基本要求。Adobe Reader 自不必说。 体验软件 SumatraPDF 特点&#xff1a;简洁。开源免费的小个子软件&#xff0c;当前最新安装包只有7M&#xff0c;启动速度很…

【初阶算法4】——归并排序的详解,及其归并排序的扩展

目录 前言 学习目标&#xff1a; 学习内容&#xff1a; 一、介绍归并排序 1.1 归并排序的思路 1.2 归并排序的代码 1.2.1 mergesort函数部分 1.2.2 process函数部分 1.2.3 merge函数部分 二、AC两道经典的OJ题目 题目一&#xff1a;逆序对问题 题目二&#xff1…

笔记本选购指南

大学生笔记本电脑选购指南 文章目录 笔记本分类指标排行 了解自身需求理工科文科艺术总结 参考指标品牌CPU显卡屏幕其他 购买渠道推荐游戏本Redmi G 锐龙版联想G5000惠普光影精灵9天选4锐龙版联想R7000P暗影精灵9联想拯救者R9000P 全能本华硕无畏PRO15联想小新Pro14 2023 轻薄本…

react ant ice3 实现点击一级菜单自动打开它下面最深的第一个子菜单

1.问题 默认的如果没有你的菜单结构是这样的&#xff1a; [{children: [{name: "通用配置"parentId: "1744857774620672"path: "basic"}],name: "系统管理"parentId: "-1"path: "system"} ]可以看到每层菜单的p…

期权投资的优势有哪些方面?

随着金融市场的不断演变&#xff0c;越来越多的金融衍生品出现在人们的视线中&#xff0c;特别是上证50ETF期权可以做空T0的交易模式吸引了越来越多的朋友&#xff0c;那么期权投资的优势有哪些方面&#xff1f; 期权是投资市场中一个非常重要的投资方式&#xff0c;期权投资能…

SOLIDWORKS装配体如何使用全局变量

客户痛点&#xff1a;随着人力资源价格的增长&#xff0c;设计的时间需要减少时间&#xff0c;提高设计效率。 数据问题&#xff1a;以前单个数据都需要建立单独的数据结构&#xff0c;装配体的模型都要重新建立。 需要解决的问题&#xff1a;能够快速地完成3D模型及装配体的…

TensorFlow 03(Keras)

一、tf.keras tf.keras是TensorFlow 2.0的高阶API接口&#xff0c;为TensorFlow的代码提供了新的风格和设计模式&#xff0c;大大提升了TF代码的简洁性和复用性&#xff0c;官方也推荐使用tf.keras来进行模型设计和开发。 1.1 tf.keras中常用模块 如下表所示: 1.2 常用方法 …