Python灰帽编程——初识Python下篇

2023-10-31

1. 函数

需求:随机密码生成器。

逻辑上讲,函数就是一个功能;代码上讲,多条Python 语句的集合,语句块。

1.1 函数介绍

1.1.1 函数基本概念

函数是对程序逻辑进行结构化或过程化的一种编程方法,将整块代码巧妙地隔离成易于管理的小块。把重复代码放到函数中而不是进行大量的拷贝,这样既能节省空间,也有助于保持一致性;通常函数都是用于实现某一种功能。

1.1.2 创建函数

Python 中函数是用==def==语句来创建的,语法如下:

def function_name(args):
    """
    定义一个函数
    """
    pass		# 可以表示任意语句

标题行由def 关键字,函数的名字,以及参数的集合(如果有的话)组成。

def 子句(函数体)的部分包括:

  • (可选)体现为字符串的函数文档(函数说明,以及帮助等信息)
  • (必需)函数体

1.1.3 调用函数

同大多数语言相同,Python 用()调用函数:

  • 如果没有加圆括号,只是对函数的引用;
# 01 - 函数的定义和调用.py

def test():			# 定义函数,函数名为test
    print("This is function test")

test()				# 调用函数

函数调用过程

  • 函数被调用时,会单独开辟一段私有的内存空间
  • 函数运行结束的之后,会回到调用函数的位置,继续向下执行
# 02 - 函数的调用过程.py

def a():
    print("This is function a")

def b():
    print("Function b start...")
    a()
    print("Function b stop!")

b()

1.1.4 前向引用

先定义,后调用。

>>> test()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'test' is not defined
>>> def test():
...     print("This is function test")
... 
>>> test()
This is function test
>>>

1.1.5 函数返回值

多数情况下,函数并不直接打印数据,而是向调用者返回一个值:

  • 函数的返回值使用return 关键字。
  • 没有return 的话,函数默认返回None。
# 03 - 函数的返回值.py

def add():
    x = 10
    y = 3
    sum = x + y
    # print(sum)
    return sum

print(add() + 7)		# 函数自身是没有值(为None)。如果该函数有返回值,那么该函数就有值了。

1.2 函数参数

1.2.1 定义参数

类似于数学上的代数,用字母表示数。参数分为:

参数类型 说明
形式参数 函数定义时,紧跟在函数名后圆括号内的参数被称为形式参数,简称形参。 由于它不是实际存在变量,所以又称虚拟变量。
实际参数 函数调用时,函数名后面括号中的参数(可以是一个表达式) 称为“实际参数”,简称实参。
# 04 - 形参和实参.py

def add(x, y):
    sum = x + y
    return sum

print(add(10, 3))

注意:实参要与形参一一对应。

1.2.2 默认参数

默认参数,不向该参数传入值也是允许的

# 05 - 默认参数.py

def add(x = 0, y = 0):
    sum = x + y
    return sum

print(add())

1.2.3 关键字参数

关键字参数的概念仅仅针对函数的调用。这种理念是让调用者通过函数调用中的参数名字来区分参数。这样规范允许参数缺失或者不按顺序

# 06 - 关键字传参.py

def add(x = 0, y = 0):
    sum = x + y
    return sum

print(add(y = 10, x = 3))	# 这里的x和y是形参。

1.3 函数变量作用域

全局和局部的问题。

1.3.1 局部变量

局部变量是在函数内部定义的变量,随着函数的调用而被创建,函数调用完毕之后,即销毁。局部变量在函数调用后,才被创建,其作用范围,仅限于函数内部。

# 07 - 局部变量.py

def test():
    x = 10
    print(x)

test()

print(x)        #NameError: name 'x' is not defined

1.3.2 全局变量

在函数外部定义的变量。

# 08 - 全局变量.py

x = 10

def test():
    # x = 3
    print(x)

test()

函数内部可以直接使用函数外部的变量。

1.3.3 名字空间

namespace。

提到变量作用域,可以想像是否可以“看见”这个标识符。

任何时候,总有一个到三个活动的作用域,分别为局部、全局和内建。标识符(变量名,函数名)的搜索顺序依次是局部、全局和内建。提到名字空间,可以想像是否有这个标识符。

1.4 其他特性

1.4.1 函数属性

函数属性是就是可以是函数名加上句点add.__ 能够访问到的内容。

# 09 - 函数的属性.py

def add(x = 0, y = 0):
    "add(x, y) means x + y"
    sum = x + y
    return sum

print(add.__name__)		# 输出函数的名称
print(add.__doc__)      # 输出双引号中的内容 文档的说明

说明__doc__ 属性来获取函数、模块、类或方法的文档字符串(双引号中的内容)。

1.4.2 内部函数

在函数体内创建另外一个函数是完全合法的,这种函数叫做内部/内嵌函数

# 10 - 内部函数.py

def a():
    print(f"This is function {a.__name__}")

    def b():
        print(f"This is function {b.__name__}")

    b()

a()

1.4.3 位置参数

位置参数,与shell 脚本类似,程序名以及参数都以位置参数的方式传递给Python程序。

使用sys 模块的argv 列表接收。

# 11 - 位置参数.py
import sys

x = sys.argv[1]
x = int(x)
y = sys.argv[2]
y = int(y)

def add(x = 0, y = 0):
    sum = x + y
    return sum

print(add(x = x, y = y))

1.5 随机密码生成器

# 随机密码生成器.py
import string	
import random

# 方式二
# import sys
# x = sys.argv[1]

x = input("请输入需要生成的密码位数:")

# strip()去除首位空格
c_set = string.printable.strip()

def password_generator(x):
    password = ""
    for i in range(1, x + 1):
        c = random.choice(c_set)
        # print(c)
        password += c
    return password    

print("密码生成成功请妥善保管:" +  password_generator(int(x)))

说明

  • random.choice(c_set):从非空序列c_set返回一个随机元素。

2. 文件对象

需求:Linux shadow 文件破解,从字典文件中读取密码。

函数速查

常用函数 功能
f = open(‘PATH’) 打开指定路径的文件f 是文件对象。
f.read() 从文件对象中读取文件内容
f.readline() 读取一行内容
f.readlines() 返回一个列表,元素是文件的每一行内容
f.write() 向文件中写入内容
f.writelines() 以列表的方式向文件中写入内容。
f.close() 关闭文件
time.sleep() 沉睡响应的秒数

2.1 文件打开方式

2.1.1 打开文件

使用open() 函数打开文件

基本语法:

>>> f = open("./pass.dic")
>>> type(f)
<class '_io.TextIOWrapper'>
>>>

2.1.2 关闭文件

>>> f.close()
>>> f.closed
True
>>>

2.1.3 访问模式

访问模式 操作 说明
r 以读方式打开 默认打开文件的方式 文件不存在则报错。
w 以写方式打开 文件存在则清空,不存在则创建。
a 以追加模式打开 不存在则创建。
+ 以读写模式打开 如r+,w+,a+。
b 以二进制模式打开 如rb,wb,ab。

常用打开文件的参数:

r
w
a
rb
wb
ab
>>> f = open("./pass.dic", "r")
>>> f.closed
False
>>>

2.2 文件读取

2.2.1 read()

read() 方法用来读取文件内容。

>>> f = open("./pass.dic",'r')
>>> f.read()
'123456\npassword\nabc123\nqwerty\n1qaz@WSX\na1b2c3\n123.com\ntoor\nzhangsan1990\n88888888'
>>>

read() 方法有点莽,读取文件中所有内容,此方法慎用。

read() 方法比较适合读取二进制文件,包括exe 程序,图片等文件,不适合读取纯文本文件。

2.2.2 readline()

读取打开文件的一行(读取下个行结束符之前的所有字节),包括行结束符,作为字符串返回。它也有一个可选的size 参数,默认为-1,代表读至行结束符,如果提供了该参数,那么在超过size 个字节后会返回不完整的行。

该函数每执行一次,向下读取一行。

>>> f = open("./pass.dic",'r')
>>> f.readline()
'123456\n'
>>> f.readline()
'password\n'
>>>

2.2.3 readlines()

readlines() 方法读取所有(剩余的)行然后把它们作为一个元素是字符串的列表返回。

>>> f.readlines()
['abc123\n', 'qwerty\n', '1qaz@WSX\n', 'a1b2c3\n', '123.com\n', 'toor\n', 'zhangsan1990\n', '88888888']
>>>

2.2.4 文件迭代

如果需要逐行处理文件,可以结合for 循环迭代(遍历)文件。迭代文件的方法与处理其他序列类型的数据类似。

# 12 - 文件迭代.py

f = open(file = "./pass.dic", mode = "r")

for i in f:
    print(i.strip())

f.close()

说明strip() 是字符串对象的一个方法,用于去除字符串两端的空白字符(包括空格、制表符、换行符等)。

有可能遇到的问题:

  • 在编程时,f.close() 方法容易忘记写。
  • 在处理文件时,有可能会遇到异常,导致整个脚本强制退出,f.close() 不会被执行到。
# 13 - 文件迭代的改进方法.py

with open(file = "./pass.dic", mode = "r") as f:
    for line in f:
        print(line.strip())

2.3 文件输入

2.3.1 write()

write() 内建方法功能与read() 和readline() 相反。它把含有文本数据或二进制数据块的字符串写入到文件中去。写入文件时,不会自动添加行结束标志,需要程序员手工输入。

>>> f = open('sec.dic', 'a')
>>> f.write('360\n')
4
>>> f.close()
>>> f = open('sec.dic', 'a')
>>> f.write("eversec\n")
8
>>> f.close()
>>>

2.3.2 writelines()

和readlines() 一样,writelines() 方法是针对列表的操作,它接受一个字符串列表作为参数,将它们写入文件,行结束符并不会被自动加入,所以如果需要的话,必须在调用writelines() 前给每行结尾加上行结束符。

>>> l
['venustech\n', 'nsfocus\n', 'topsec\n', 'dbappsecrutiy\n', 'knownsec\n', 'colasoft\n', 'sangfor\n', 'qianxin\n', 'chaitin\n', 'sbr-info\n']
>>> f = open('sec.dic', 'a')
>>> f.writelines(l)
>>> f.close()
>>>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python灰帽编程——初识Python下篇 的相关文章

随机推荐

  • Spring基础篇-JdbcTemplate

    传统jdbc开发 有很多模板化代码 而为了简化 将模板代码封装起来 就是用了AOP思想 开发者只需要管住数据的关键操作 但是 与MyBatis相比 在一对一映射 一对多映射 以及动态SQL等方法 还是不足 使用JdbcTemplate 需要
  • 蒙特卡罗算法 与 拉斯维加斯算法

    蒙特卡罗算法并不是一种算法的名称 而是对一类随机算法的特性的概括 那么 蒙特卡罗 是一种什么特性呢 我们知道 既然是随机算法 在采样不全时 通常不能保证找到最优解 只能说是尽量找 那么根据怎么个 尽量 法儿 我们我们把随机算法分成两类 蒙特
  • 数据卷与挂载目录

    前言 数据卷与挂载目录都是数据持久化存储的方式 一 卷和挂载目录有什么区别 卷 Docker Volume 是受控存储 是由 Docker 引擎进行管理维护的 因此使用卷 你可以不必处理 uid SELinux 等各种权限问题 Docker
  • 关于硬件工程师的真相:敢问路在何方? 

    关于硬件工程师的真相 敢问路在何方 硬件工程师 曾经有多少人希望从事的职业 在别人眼里好像能够从事硬件设计需要你了解很多东西 可以从事这个职业之后才逐渐发现 硬件工程师处在一种非常难受的困境当中 想来造成这种情况可能主要有多方面的原因 一个
  • 时间序列预测的常用20种方法优缺点对比深入分析

    百度百科 时间序列预测是指利用获得的数据按时间顺序排成序列 分析其变化方向和程度 从而对未来若干时期可能达到的水平进行推测 时间序列预测的基本思想 就是将时间序列作为一个随机变量的一个样本 用概率统计的方法 从而尽可能减少偶然因素的影响 当
  • latex论文写作问题集锦

    目录 latex冷门指令 实现对Appendix A的引用 修改错误公式后 File ended while scanning use of newl bel Edas 上传 fonts are embedded 概念性问题 theorem
  • CORE-ESP32C3

    目录 基础资料 探讨重点 参考博文 实现功能 硬件准备 软件版本 日志及soc下载工具 软件使用 接线示意图 IO11解锁教程可参考 功能1 基于墨水屏的日期显示 初始化 日期显示 功能2 WLAN连接示例 功能3 SNTP时间服务器的动态
  • 常见优化方法及慢查询

    exist 和 in select from table where exist 子查询 select from table where 字段 in 子查询 如果主查询的数据集大 则使用In 效率高 如果子查询的数据集大 则使用exist
  • 怎么查看mysql密码_怎么查看mysql密码

    MySQL数据库查看密码的方法如下 以系统管理员身份运行cmd 查看mysql是否已经启动 如果已经启动 就停止 net stop mysql 切换到MySQL安装路径下 D WAMP MySQL 5 6 36 bin 如果已经配了环境变量
  • 【蓝桥杯单片机】第十章 数码管(基础篇)

    第一节 硬件解读 蓝桥杯单片机的数码管一共有八位 如下图 这两部分完全是一摸一样的 公子就以左侧的 DS1 为例了 在图中我们不难发现 9到12脚显示的是com1到com4 这是什么呢 这些com代表了是哪一位数码管 比如com3就代表了第
  • Web学习笔记-React(组合Components)

    笔记内容转载自 AcWing 的 Web 应用课讲义 课程链接 AcWing Web 应用课 CONTENTS 1 创建父组件 2 从上往下传递数据 3 传递子节点 4 从下往上调用函数 5 兄弟组件间传递消息 6 无状态函数组件 7 组件
  • 常用的iPhone app快捷url链接

    版本一 系统 短信 sms app store itms apps 电话 tel 备忘录 mobilenotes 设置 prefs root SETTING E Mail MESSAGE 支付宝 支付宝 alipay 蚂蚁庄园 alipay
  • vue在有菜单的情况下,创建一个某页面内的菜单

    场景 本系统有一个整体的菜单 但是一个模块的需求是 需要在这个模块首页再加一个菜单 代码 在路由中加入一级菜单及所有的二级菜单 path xfj component gt import views xfj xfjIndex hidden t
  • Python while循环语句

    Python while循环语句 一 while使用说明 1 循环语句允许我们执行一个语句或语句组多次 程序员可以通过条件控制循环次数 1 猜数字游戏实例演示 1 猜数字游戏 当你猜的价格不对时 继续猜 2 当你猜对猜数字时 正常退出本次游
  • DBCP连接池配置参数说明

  • JDK安装与配置(简单)

    一 下载JDK 没有JDK的伙伴可以在官网自行下载 https www oracle com java technologies downloads 这里我用的是JDK1 8的版本 下载时选择的路径要记住 直接默认下一步就行 安装好后 这个
  • 【问题解决】Ubuntu 12.04 网络连接有规律的时断时续

    问题描述 也不知道是哪里乱点什么了 有一天ubuntu12 04 的网络就突然不能用了 然后我就网上查找解决方法 一查才知道linux下面的网络连接有两种方式 一种是一种是network manager 另一种是通过 etc network
  • go基础简介

    目录 数据类型 高级类型 自定义数据类型 interface接口 数组与切片 控制语句 if for 闭包问题 平行赋值 switch select 函数 错误处理 示例程序 Go语言是一种静态强类型 编译型 并发型 并具有垃圾回收功能的编
  • 被ChatGPT“抢饭碗”的人

    ChatGPT问世至今 互联上讨论声绵延不绝 有人说 AI会替代基础性工作 一名金融从业者对 橡果商业评论 表示 这实际上是对人类经验的替代 那些引以为傲的经验 来源于对历史的总结 AI出现后 人类过去经验 不再重要了 也有学界人士反驳 认
  • Python灰帽编程——初识Python下篇

    文章目录 1 函数 1 1 函数介绍 1 1 1 函数基本概念 1 1 2 创建函数 1 1 3 调用函数 1 1 4 前向引用 1 1 5 函数返回值 1 2 函数参数 1 2 1 定义参数 1 2 2 默认参数 1 2 3 关键字参数