Giter Club home page Giter Club logo

pythonhackingbook1's Introduction

Pytnon黑客编程之极速入门

前言

在进行网络安全培训的过程中,很多同学都会问“如何成长为真正的黑客”之类的问题。我都会告诉他们,编程是基础,编程能力决定你理解的是否深入,能走的是否够远。你是想做一个只会用工具的人,还是想做一个能写工具给别人用的黑客? 当然这是针对初学者的激励,安全工作的方方面面都离不开编程,网络协议分析、数据抓取和解析、逆向工程、自动化扫码、漏洞测试和攻击......哪一样离了编程,都玩不转。但是什么样的编程语言是最合适的呢?

我接触过很多编程语言,c/c++,Java,C#,PHP,Perl,F#,Ruby,JavaScript等等,都是在不同的工作环境或者面对不同的工作任务时候被动接触的,每种语言都有自己的特性和优势,这里我们不去做过多的对比。我最开始从事网络安全相关的工作任务的时候使用的是C 和 C#,使用C#是出于个人喜好,以及在windows上编程的便利性;使用C是为了跨平台和他的底层能力。后来接触了Python,Python在绝大多数场景中直接替代了C和C#。在阅读了很多国外黑客的文章,使用了很多流行的工具之后,我意识到在这个领域里Python具有绝对的霸主地位,尤其是在读了《Gray Hat Python: Python hackers and reverse engineers》一书之后,对Python在底层编程方向上的能力有了新的认识,从此爱上这门语言,一发不可收拾。社区为Python开发了大量的库,我们可以几行代码�就实现数据包监听和解析,几十行代码实现Web数据抓取和分析,便利性是其他语言不可比的。同时,黑客们使用Python编写了大量的工具,并且都是开源的,不论是我们参考他们的实现来实现自己的工具还是做上层封装调用各种工具,都极其便利。所以说,黑客编程,Python是最好的选择。

为什么要编写这套课程?

“师父领进门,修行在个人”。其实入门是最难的,大量的网络安全爱好者,他们对“黑客”这个词的理解并不准确,一上来把精力放到了各种实战上,�甚至花费很多钱购买各种�以演示为主的教程上,结果�几年过去了,仍然不得其法,一直在门外徘徊。互联网和计算机上看到的一切,都是代码构成的,从理解代码开始,来理解计算机,理解网络,理解程序,理解架构,这才是不二心法。 本着给更多的入门者引路的想法,我着手编写这套教程。

本教程的特点

入门要简单,曲线要平滑,是这套课程的设计思路。有的书让人读起来一气呵成,有的书读着读着就放弃了,计算机书籍让人放弃的尤其多,究其原因,在于作者将重点放到了知识本身而不是读者的学习过程。 入门类书籍或者教程需要把重点放在“引导”、“解惑”和“练习”上面。本教程保持了如下特点:

  1. 快速上手。抛弃过于晦涩的理论讲解,通过实践建立从感性到理性的过渡。
  2. 曲线平滑。尽可能的照顾最广大的读者,保持各章节内容和知识点上的连贯性。
  3. 讲练结合。不讲大道理,也不堆代码,保持案例的简洁性和合理性。
  4. 深广适中。教程会优先注重广度,让读者有全面的认识和感知。深度上适当扩展。
  5. 提供源码。所有实际案例的源码,都会提供github的链接。

内容概览

教程核心内容分为6个大的部分:

1. Python编程基础

如果有一定的Python编辑基础的同学来�阅读本教程会更容易,�为了同时照顾没有接触过Python基础的同学,在教程的第一部分用两章来介绍�Python编程基础,以便首次接触Python的同学可以按照教程的内容快速入门,理解书上的例子。

本部分和书上的例子紧密相关,但是不会涵盖Python编程基础的方方面面,真正的理解Python编程,还需要多下功夫看其他的书籍。

2. 网络安全

这一部分,集中在网络协议解析,网络层和传输层数据包捕获和注入。网络协议是网络安全的基础,本部分开篇会首先讲解下TCP/IP体系结构的基本概念,在理解协议的基础上理解代码和程序是如何描述网络协议的,如何利用网络协议来达到监听或者数据篡改的目的的。针对以太网和Wifi,都会利用案例来进行讲解。

3. Web应用安全

Web应用不论实在桌面端还是移动端,都是我们使用最广泛的应用形式。Web应用从应用编码到容器都存在安全漏洞,有很多经典的漏洞一直存在,比如Sql注入、XSS等。 本部分从Http协议入手,来讲解Web应用的基本原理,在此基础上,讲解经典漏洞的形成原理。了解了漏洞原理,我们就可以通过编程的方式来进行漏洞扫描和自动化攻击了。

4. 漏洞利用

这部分集中在针对已经存在的漏洞,如何进行Exploit,编写PoC。信息搜集是渗透测试非常重要的第一步,在信息搜集的基础上需要对目标服务器存在的漏洞进行扫描和探测,探测到已知漏洞,想要突破必须要进行Exploit。在网上我们可以找到大量的使用Python编写的PoC,本部分会相信讲解漏洞利用插件的编写方法和如何进行自动攻击。

5. 逆向

逆向的基本功是调试,Pydbg是功能强大的调试工具,本部分会介绍该工具的使用。漏洞利用环节,我们会演示如何通过内存补丁的方式达到破解目的。

6. 自动化

程序和手工相比,一个重要的优势就是自动化。通过Python编程,我们可以对多任务进行调度,可以把若干工具整合起来,可以将手工的工作流程整体串联,自动扫描,自动攻击,自动生成报告等等。

一点期待

期望通过本教程的学习,各位同学能找到黑客编程的入门之路,能具备编写自己的安全工具的能力,能自己编写代码执行自动化攻击。最最重要的,能从代码的角度,理解你看到的一切。

这个教程的目标是引路,我只有两个实用招式传授给你们:多写代码,多多实践。

本书大纲

课程大纲

Python 黑客编程之极速入门

第一章: Python 编程基础

• Python简介和开发环境搭建
• 数值类型
• 字符串、列表、元组、字典和集合
• 流程控制
• 函数
• 模块
• 异常处理
• 面向对象编程

第二章: 系统级编程与安全

• Python编程之禅
• 文件和目录
• 线程
• 进程的创建
• 多进程
• 进程内通信 (IPC)
• 实例讲解

第三章: 网络安全编程 – 嗅探和注入

• 原始套接字基础
套接字编程
• 服务端和客户端编程
• 无线嗅探
• 数据包注入
• PCAP 分件分析
• 实例讲解

第四章: Web 应用安全

• web服务端和浏览器端
• Web应用模糊测试
• HTML 内容自动分析
• 浏览器模拟
• 攻击Web Service
• 代理
• 自动化攻击(SQL注入,XSS等)
• 实例讲解

第五章: 漏洞利用

• Exploit 开发技术
• 免杀
• 使用Python写漏洞利用插件
• 二进制分析
• 自动攻击
• 实例讲解

第六章: 恶意软件分析和逆向工程

• 进程调试
• Pydbg 入门
• 实时应用分析
• 断点调试
• 内存补丁
• 实例讲解

第七章: 自动化攻击

• Python自动化攻击
• 常用类库和应用
• 实例讲解

第8章: 课程总结和寄语

--

pythonhackingbook1's People

Contributors

xuanhun avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pythonhackingbook1's Issues

3.5 arp欺骗 UnboundLocalError 和 手动停止的解决办法

在Python3.6.8中,需要将main函数中定义的子函数build_reqbuild_rep,调整到调用的语句之前。
手动停止的办法参考

  1. 引入signal模块,构造退出函数
import signal
def quit(signum,frame):
    print('终止攻击')
    sys.exit(0)
  1. 在while循环前加入信号识别
signal.signal(signal.SIGINT,quit)
signal.signal(signal.SIGTERM,quit)
while True:
......

1.6模块

def add(a,b):
    return a+b
def sub(a,b):
    return a-b
def mult(a,b):
    return a*b
def div(a,b):
    return a/b

import zuoye
a=12
b=13
print('a+b=',zuoye.add(a,b))
print('a-b=',zuoye.add(a,b))
print('a*b=',zuoye.mult(a,b))
print('a/b=',zuoye.div(a,b))

111"""from threading import Thread

"""from threading import Thread
import time
import os
class Mythread(Thread):
def init(self,path):
super().init()
self.path=path

def run(self):
    path=self.path
    files = []
    dirs = []
    for (dirpath, dirnames, filenames) in os.walk(path):
        # files += filenames
        # dirs += dirnames
        # print(files)
        # print(dirs)
        for fn in filenames:
            filepath=os.path.join(dirpath,fn)
            with open(filepath,encoding='utf8')as f:
                text=f.read()
                print(text)

filepath=[r'C:\Users\10396\Desktop\新建文件夹',r'C:\Users\10396\Desktop\新建文件夹 (2)']

t=[]
for i in range(2):
t1=Mythread(filepath[i])
#print(f'我是主线程{i}')
t1.start()
t.append(t1)

for i in t:
i.join()
"""

Originally posted by @hong-xiaobo in #27 (comment)

1.5函数

def printRight(Username,Passwords):
Prints the usernames and passwords.
    The two valuse should be right.'''
    if(Username=='seven'):
        if(Passwords==123):
            print("登陆成功!")
        else:
            print("登陆失败!")
printRight('seven',123)
printRight('seven',1234)
print(printRight.__doc__)

def printList(i,sum):
    '''Prints the two numbers.
    The if the one of number is odd ,it should be sub.other number is even,it should be  sum.'''
    while(i<=100):
        if(i%2==0):
            sum+=i
        else:
            sum-=i
        i+=1
    print(sum)
printList(3,0)
printList(2,0)
print(printList.__doc__)

1.5 函数 打卡 如有错误希望大佬指点

# 将1.4节的练习题的实现都封装到函数中,传入不同的参数进行调用测试
# 实现用户输入用户名和密码,当用户名为 seven且密码为123时,显示登陆成功,否则登陆失败!
def login(Username,Password):
    while True:
        Username = str(input("请输入用户名"))
        Password = int(input("请输入密码"))
        if Username == str("seven") and Password == int("123"):
            print("成功登录")
            break
Username = str(input("请输入用户名"))
Password = int(input("请输入密码"))
login(Username,Password)

# 用while循环实现输出2-3+4-5+6.....+100的和
def sum(if1=100):
    i = s1 = c = 0
    while True:
        i += 1
        if i % 2 == 0:
            s1 += i
        else:
            s1 -= i
        if i == int(if1):
            break
    print(s1 + 1)
if1 = int(float(input("请你输入最后的数字:")))
sum(if1)

1.7异常处理

def test(str):
    str= input("请输入一个字符串: ")
    if str!='ABC':
        raise NameError('无效输入,请重新输入...')
try:
    test('ABC')
except NameError as e:
    print(e)
else:
    print("yes!")

求助:VS中python运行pip添加itchat微信模块失败

各位学长好,这篇教程看了后,我尝试着安装了itchat的微信模块,但是发现import之后。itchat里的方法和变量不能正常引用(类似出现像:module 'itchat' has no attribute 'auto_login')的现象。我到阿如的步骤是直接在VS命令行里pip install itchat 了,请问有遇到同样问题的朋友或者大神帮帮忙吗,非常感谢~

wow!分享精神,酷!

跌跌撞撞写程序5年多了,按部就班学了各种语言,做过网站,玩过可视化,写应用程序,现在工作是做游戏。总是想入门黑客,但每每插肩而过渠道偏而少。看到这repo大纲,支持作者技术传播,给自己立个flag,工作了也会常来关注,也希望作者坚持更新。

1.3string

print("字符串...")
str1='du','ao','ge','hello','word',"hello worde!"
print("原数据为:",str1)
print(str1[1:5])
str2=1,2,3
str1=str2+str1[3:]#将字符串前n个字符替换为指定的字符
print(str1)

1.3list

#1.通过索引的方法

print("list...")
list1=[1,2,3,4,5,6,7,8,9,'du','ao','duaoge']
print(list1[::-1])

Hello

Describe the bug

A clear and concise description of what the bug is.

To Reproduce

Steps to reproduce the behavior:

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error

Expected behavior

A clear and concise description of what you expected to happen.

Screenshots

If applicable, add screenshots to help explain your problem.

Kitex version:

Please provide the version of Kitex you are using.

Environment:

The output of go env.

Additional context

Add any other context about the problem here.

1.4 流程控制

Username=str(input('请输入用户名:'))
password=int(input('请输入密码:'))
if(Username=='seven'):
    if(password==123):
        print("登陆成功!")
    else:
        print("登陆失败!")

i=2
sum=0
while(i<=100):
    if(i%2==0):
        sum+=i
    else:
        sum-=i
    i+=1
print(sum)

这是一本python入门课程?

你好,readme中讲这是一门python黑客编程课程,看仓库里都是Python的入门课程,是不是接下来会讲黑客编程?

2.3 多进程编程的Pool.py 是否缺了主函数?

from multiprocessing import Process,Pool
import time

def Foo(i):
time.sleep(2)
return i+100

def Bar(arg):
print('-->exec done:',arg)

if name == "main":
pool = Pool(5) #允许进程池同时放入5个进程

    for i in range(10):
            pool.apply_async(func=Foo, args=(i,),callback=Bar)  #func子进程执行完后,才会执行callback,否则callback不执行(而且callback是由父进程来执行了)
    
    print('end')
    pool.close()
    pool.join() #主进程等待所有子进程执行完毕。必须在close()或terminate()之后。

操作多线程

import time
import os
class Mythread(Thread):
    def __init__(self,path):
        super().__init__()
        self.path=path

    def run(self):
        path=self.path
        files = []
        dirs = []
        for (dirpath, dirnames, filenames) in os.walk(path):
            # files += filenames
            # dirs += dirnames
            # print(files)
            # print(dirs)
            for fn in filenames:
                filepath=os.path.join(dirpath,fn)
                with open(filepath,encoding='utf8')as f:
                    text=f.read()
                    print(text)

filepath=[r'C:\Users\10396\Desktop\新建文件夹',r'C:\Users\10396\Desktop\新建文件夹 (2)']

t=[]
for i in range(2):
    t1=Mythread(filepath[i])
    #print(f'我是主线程{i}')
    t1.start()
    t.append(t1)

for i in t:
    i.join()

2.3 多进程编程的Pool.py 忘记加主函数

from multiprocessing import Process,Pool
import time

def Foo(i):
time.sleep(2)
return i+100

def Bar(arg):
print('-->exec done:',arg)

if name == "main":
pool = Pool(5) #允许进程池同时放入5个进程

    for i in range(10):
        pool.apply_async(func=Foo, args=(i,),callback=Bar)  #func子进程执行完后,才会执行callback,否则callback不执行(而且callback是由父进程来执行了)
    
    print('end')
    pool.close()
    pool.join() #主进程等待所有子进程执行完毕。必须在close()或terminate()之后。

2.2 多线程编程+2.3 多进程编程作业疑惑?

普通读取目录.py
#!/usr/bin/env python

-- coding:utf-8 --

Author: maolin

import threading
import time
import os

a = time.time()
def find_all_file(parentDir,tag):
if os.path.isdir(parentDir): # 是目录
dir_list = os.listdir(parentDir)
paths = [os.path.join('%s%s' % (parentDir, tt)) for tt in dir_list]
for path in paths:
find_all_file(path,tag)
else: # 不是目录,直接输出
print('------------'+str(tag))
print(parentDir)

设置读取盘符路径

parentDir1 = 'C:'
j=1;
for i in range(1,4):
find_all_file(parentDir1,j)
j = j+1
b = time.time()
print(b-a)

多线程读取目录.py
#!/usr/bin/env python

-- coding:utf-8 --

Author: maolin

import threading
import time
import os

a = time.time()
def find_all_file(parentDir,tag):
if os.path.isdir(parentDir): # 是目录
dir_list = os.listdir(parentDir)
paths = [os.path.join('%s%s' % (parentDir, tt)) for tt in dir_list]
for path in paths:
find_all_file(path,tag)
else: # 不是目录,直接输出
print('------------'+str(tag))
print(parentDir)

设置读取盘符路径

parentDir1 = 'C:'
parentDir2 = 'C:'
parentDir3 = 'C:'

创建一个线程

thead1 = threading.Thread(target=find_all_file(parentDir1, 1))
thead2 = threading.Thread(target=find_all_file(parentDir2, 2))
thead3 = threading.Thread(target=find_all_file(parentDir3, 3))

启动刚刚创建的线程

thead1.start()

线程等待

thead1.join()
thead2.start()
thead2.join()
thead3.start()
thead3.join()
b = time.time()
print(b-a)

多进程-pool-读取目录.py
#!/usr/bin/env python

-- coding:utf-8 --

Author: maolin

from multiprocessing import Pool
import os, time, random
'''
pool
如果要启动大量的子进程,可以用进程池的方式批量创建子进程:
'''

def long_time_task(parentDir):
if os.path.isdir(parentDir): # 是目录
dir_list = os.listdir(parentDir)
paths = [os.path.join('%s%s' % (parentDir, tt)) for tt in dir_list]
for path in paths:
long_time_task(path)
else: # 不是目录,直接输出
print("文件为:"+str(parentDir))

if name == 'main':
a = time.time()
print('Parent process %s.' % os.getpid())
parentDir1 = 'C:'
parentDir2 = 'C:'
parentDir3 = 'C:'
p = Pool(3) #就可以同时跑3个进程。
for i in [parentDir1,parentDir2,parentDir3]:
p.apply_async(long_time_task, args=(i,)) #异步非阻塞
p.close()
p.join()
b = time.time()
print(b - a)

多进程-queue-读取目录.py
#!/usr/bin/env python

-- coding:utf-8 --

Author: maolin

from multiprocessing import Process, Queue
import os, time, random

写数据进程执行的代码:

def long_time_task(parentDir):
if os.path.isdir(parentDir): # 是目录
dir_list = os.listdir(parentDir)
paths = [os.path.join('%s%s' % (parentDir, tt)) for tt in dir_list]
for path in paths:
long_time_task(path)
else: # 不是目录,直接输出
print("文件为:"+str(parentDir))

if name == 'main':
# 父进程创建Queue,并传给各个子进程:
a = time.time()
parentDir1 = 'C:'
parentDir2 = 'C:'
parentDir3 = 'C:'
q = Queue()
p1 = Process(target=long_time_task(parentDir1), args=(q,))
p2 = Process(target=long_time_task(parentDir2), args=(q,))
p3 = Process(target=long_time_task(parentDir3), args=(q,))
# 启动子进程p1,写入:
p1.start()
# 等待p1结束:
p1.join()
# 启动子进程p2,写入:
p2.start()
# 等待p2结束:
p2.join()
# 启动子进程p3,写入:
p3.start()
# 等待p3结束:
p3.join()
b = time.time()
print(b - a)

需要答疑点:
1 首先不知道按照理解写的code是否正确?
2 为什么普通读取和多线程读取,以及多进程pool和queue读取时间上没有什么差异?

1.2数值类型

#2.2.1 标准整型和长整型

a = 0o101
print("a="+str(a))
b=64
print('b='+str(b))
c=-237
print('c='+str(c))
d=0x80
print('d='+str(d))
e=-0x92
print('e='+str(e))
longint=34252456245724572456723
print('longint='+str(longint))
#1.2.2 布尔型和布尔对象
print(bool(1))
print(bool(True))
print(bool('0'))
print(bool([]))
print(bool((1,)))
foo = 42
bar = foo<42
print(bar)
print(bar+10)
print('%s' %bar)
print('%d' %bar)
#无_nozero_()
class C:pass
c=C()
print(bool(c))
#1.2.3 双精度浮点型
print(0.0)
print(-777.)
print(-5.555567119)
print(96e3 * 1.0)
print(-1.609E-19)
#1.2.4 复数
print(complex(2, 4))
print(1.23e-045+6.7e+089j)
#1.2.5 十进制浮点型
from decimal import *
print("十进制浮点....")
dec=Decimal('.1')
print(dec)
print(Decimal(.1))
print(dec +Decimal(.1))
#1.2.7转换工厂
print("转换工厂....")
print(int(4.2222222))
print(float(4))
print(complex(4)) #复数可以用complex(real,imag)
#1.2.8进制转换
print("进制转换...")
print(hex(255)) #整数类型转换十六进制
print(oct(255)) #整数类型转换八进制 
print(oct(0x111)) #十六进制转换八进制
#1.2.9ASII转换
print("进制转换....")
print(chr(76))  #数字转换字符型
print(ord('L'))  #字符型转换数字
#ceil()是不能直接访问的,需要导入 math 模块,通过静态对象调用该方法。(向上取整)
import math
print ("math.ceil(-45.17):" ,math.ceil(-45.17))
print("math.ceil(100.12):",math.ceil(100.12))
print("math.ceil(100.72):",math.ceil(100.72))
print("math.ceil(math.pi) : ", math.ceil(math.pi))
#floor(x) 返回数字的下舍整数,小于或等于 x。方法同ceil
import math
print("math.floor(-45.17):",math.floor(-45.17))
print("math.floor(100.12):",math.floor(100.12))
print("math.floor(100.72):",math.floor(100.72))
print("math.floor(math.pi):",math.floor(math.pi))
#fabs() 方法返回数字的绝对值
import math
print("math.floor(-45.17):",math.floor(-45.17))
print("math.floor(100.12):",math.floor(100.12))
print("math.floor(100.72):",math.floor(100.72))
print("math.floor(math.pi):",math.floor(math.pi))
#factorial (x),返回x的阶乘
import math
print("math.factorial(5):",math.factorial(5))
#hypot(),返回欧几里德范数 sqrt(x*x + y*y)。
import math
print("hypot(3,2):",math.hypot(3,2))
print("hypot(-3,3):",math.hypot(-3,3))
print("hypot(0,2):",math.hypot(0,2))
#sqrt(x) 方法返回数字x的平方根。
import math
print("math.sqrt(100):",math.sqrt(100))
print("math.sqrt(7):",math.sqrt(7))
print("math.sqrt(math.pi):",math.sqrt(math.pi))
#pow() 方法返回x的y次方的值。
import math 
print("pow(100,2):",math.pow(100,2))
print("math.pow(100,-2):",math.pow(100,-2))
print("math.pow(2,4):",math.pow(2,4))
print("math.pow(3,0):",math.pow(3,0))
#sqrt(x) x的算数平方根
import math 
print("math.sqrt(4):",math.sqrt(4))
print("math.sqrt(2):",math.sqrt(2))
#log(x) 方法返回x的自然对数,x > 0。 
import math
print("math.log(100.12):",math.log(100.12))
print("math.log(100.72):",math.log(100.72))
print("math.log(math.pi):",math.log(math.pi))
#log10() 方法返回以10为基数的x对数,x>0。
import math
print("math.log10(100.12):",math.log10(100.12))
print("math.log10(100.72):",math.log10(100.72))
print("math.log10(math.pi):",math.log10(math.pi))
#注意的是并不是舍弃小数部分,而是执行floor操作,trunc函数
import math
print("math.trunc(1/2):",math.trunc(1/2))
print("math.trunc(-1/2):",math.trunc(-1/2))
#isnan()函数的返回值是True或False。
import math
print("math.isnan(2):",math.isnan(2))
print("math.isnan(0.0):",math.isnan(0.0))
print("math.isnan(0.003):",math.isnan(0.007))
print("math.isnan(-25):",math.isnan(-25))
print("math.isnan(math.pi):",math.isnan(math.pi))
#degrees() 将弧度转换为角度。
import math
print("math.degress(3):",math.degrees(3))
print("math.degress(-3):",math.degrees(-3))
print("math.degress(0):",math.degrees(0))
print("math.degress(math.pi):",math.degrees(math.pi))
print("math.degress(math.pi/2):",math.degrees(math.pi/2))
print("math.degress(math.pi/4):",math.degrees(math.pi/4))
#radians() 方法将角度转换为弧度。
import math
print("math.radians(3):",math.radians(3))
print("math.radians(-3):",math.radians(-3))
print("math.radians(0):",math.radians(0))
print("math.radians(math.pi):",math.radians(math.pi))
print("math.radians(math.pi/2):",math.radians(math.pi/2))
print("math.radians(math.pi/4):",math.radians(math.pi/4))

1.6 模块——提供基本的加、减、乘、除方法模块编写的作业 打卡

sizeyunsuan.py #名称为sizeyunsuan的模块

def sayhi():
    print('四则运算模块')
version = '0.1'
def add():#加法
    he = num1 = num2 = 0
    num1 = int(float(input("请你输入第一个数字:")))
    num2 = int(float(input("请你输入第一个数字:")))
    he = num1 + num2
    print("{}+{}={}".format(num1,num2,he))

def sub():#减法
    he = num1 = num2 = 0
    num1 = int(float(input("请你输入第一个数字:")))
    num2 = int(float(input("请你输入第一个数字:")))
    he = num1 - num2
    print("{}-{}={}".format(num1, num2, he))
def mass():#乘法
    he = num1 = num2 = 0
    num1 = int(float(input("请你输入第一个数字:")))
    num2 = int(float(input("请你输入第一个数字:")))
    he = num1 * num2
    print("{}*{}={}".format(num1, num2, he))
def cf():#除法
    he = num1 = num2 = 0
    num1 = int(float(input("请你输入第一个数字:")))
    num2 = int(float(input("请你输入第一个数字:")))
    he = num1 / num2
    print("{}*{}={}".format(num1, num2, he))

sizeyunsuan_Debug #调试.py

import sizeyunsuan
sizeyunsuan.sayhi()
print('This Version is:', sizeyunsuan.version)
while True:
    xuanze = str(input("请你重新选择一个算法\nA.加法\nB.减法\nC.乘法\nD.除法                                                      "))
    if xuanze == ("a") or xuanze == ("A"):
        sizeyunsuan.add()
        break
        
    elif xuanze == ("b") or xuanze == ("B"):
        sizeyunsuan.sub()
        break
    elif xuanze ==("c") or xuanze == ("C"):
        sizeyunsuan.mass()
        break
    elif xuanze ==("d") or xuanze == ("D"):
        sizeyunsuan.cf()
        break
    else:
        print("你输入的内容不在模块列表选项中")
pass

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.