标签 python 下的文章

Python 二进制转十进制

二进制转十进制的原理相对简单。
假设有二进制数为abc.def,对应的十进制数为A.B
那么整数部分A = a*2^2 + b*2^1 + c*2^0, 小数部分B = d*2^(-1) + e*2^(-2) + f*2^(-3)
实现程序如下:

# 二进制转十进制
def binary_to_decimal(binary):
    decimal = 0
    integer_part, fractional_part = binary.split('.')  # 拆分整数部分和小数部分

    # 转换整数部分为十进制
    for i in range(len(integer_part)):
        digit = int(integer_part[i])
        power = len(integer_part) - i - 1
        decimal += digit * (2 ** power)

    # 转换小数部分为十进制
    for i in range(len(fractional_part)):
        digit = int(fractional_part[i])
        power = -(i + 1)
        decimal += digit * (2 ** power)

    return decimal

Python 十进制(可包含小数)转二进制

原理

假设有十进制数A.B,对应的二进制数为abc.def
整数部分A = a*2^2 + b*2^1 + c*2^0,所以当A除以2时,得到a*2^1 + b*2^0和余数c除2取余)。
同理,小数部分B = d*2^(-1) + e*2^(-2) + f*2^(-3),当B乘以2时,B*2 - d = e*2^(-1) + f*2^(-2),即 B*2的整数部分求出了d乘2取整)。

所以十进制转换成二进制算法如下:

def decimal_to_binary(decimal):
    integer_part = int(decimal)  # 提取整数部分
    fractional_part = decimal - integer_part  # 提取小数部分

    # 转换整数部分为二进制
    binary_integer = ""
    if integer_part == 0:
        binary_integer = "0"  # 十进制数为0时,二进制为0
    else:
        while integer_part > 0:
            binary_integer = str(integer_part % 2) + binary_integer
            integer_part = integer_part // 2

    # 转换小数部分为二进制
    binary_fractional = ""
    while fractional_part > 0:
        fractional_part *= 2
        bit = int(fractional_part)
        binary_fractional += str(bit)
        fractional_part -= bit
        if len(binary_fractional) > 12:
            break  # 限制小数部分的位数为12位

    binary = binary_integer
    if binary_fractional != "":
        binary += "." + binary_fractional

    return binary

Python 获取url的连通性

管理多个站点列表的时候,由于很多站点都绑定了多个域名,以前想要查看每个网址的连通性,就需要复制网址到浏览器中打开,为了方便快捷判断,现通过Python的requests模块,对网址进行访问,通过返回的状态大致判定所给链接是否可以正常访问。代码如下:

#-*- coding:utf-8 -*-
import requests

url = "http://www.example.com/"

headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.55"}
try:
    response= requests.get(url, headers=headers, timeout=5).status_code
    print(response)
    if response == 200:
        print('可打开')
    else:
        print(response)
except Exception as e:
    print(e)

Python 获取域名解析的IP,包括IPv6

随着网络的发展,IPv4逐渐枯竭,IPv6随之诞生。但因为各种原因,IPv6始终没能全面普及。我们国家这几年在花大力气进行IPv6的普及工作,而且已经取得了不错的成效。那么怎样才能知道一个域名有没有解析IPv6的地址呢?
如果是通过命令的话,使用ping可以知道IPv4地址,使用ping6命令可以查出IPv6地址。
如果是通过Python脚本,则需要使用如下方法:

# 获取IPv4地址
ip = socket.gethostbyname("www.baidu.com")

# 获取IPv6地址,getaddrinfo结果返回的是元组
ip = socket.getaddrinfo(str(url), None, socket.AF_INET6)[0][4][0]

希尔排序(Python实现)

原理

希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。
希尔排序是把数据按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

时间复杂度

希尔排序是一种不稳定的排序方法,时间复杂度为:O(n^(1.3—2))。

Python实现

# -*- coding:utf-8 -*-
# 希尔排序

def shell_sort(list):
    n = len(list)
    step = n // 2
    while step > 0: # 最后的步长为1,此时就是一个标准的插入排序
        for cur in range(step, n):
            i = cur
            while i >= step and list[i-step] > list[i]:
                list[i - step], list[i] = list[i], list[i-step]
                i -= step
        step = step // 2
    return list


list = [54, 26, 93, 17, 77, 3, 31, 44, 55, 20]
print(shell_sort(list))