Python 中构建函数的最佳方式

46 阅读2分钟

用户正在使用 Python 构建一个程序,该程序可以比较他常用的公网 IP 地址和一个 TOR IP 地址。他的代码中有两个函数,一个用于获取公网 IP 地址,另一个用于连接到 TOR 网络并获取 TOR IP 地址。他想创建一个第三个函数来确认这两个 IP 地址是否不同。但是,他不确定如何将前两个函数生成的 IP 地址传递给第三个函数。

2、解决方案

方法一:在函数中使用全局变量

# 定义全局变量
public_ip_address = None
tor_ip_address = None

def public_ip():
    """获取公网 IP 地址"""
    global public_ip_address
    url = 'http://ifconfig.me/ip'
    request = urllib2.Request(url)
    request.add_header('Cache-Control','max-age=0')
    response = urllib2.urlopen(request)
    public_ip_address = response.read()

def connect_tor():
    """连接到 TOR 网络并获取 TOR IP 地址"""
    global tor_ip_address
    LOCALHOST = "127.0.0.1"
    PORT = 9150

    socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, LOCALHOST, PORT)
    socket.socket = socks.socksocket

    url = 'http://ifconfig.me/ip'
    request = urllib2.Request(url)
    request.add_header('Cache-Control','max-age=0')
    response = urllib2.urlopen(request)
    tor_ip_address = response.read()

def compare_ip_addresses():
    """比较公网 IP 地址和 TOR IP 地址"""
    if public_ip_address != tor_ip_address:
        print("IP 地址不同")
    else:
        print("IP 地址相同")

# 调用函数
public_ip()
connect_tor()
compare_ip_addresses()

方法二:在函数中使用返回值

def public_ip():
    """获取公网 IP 地址"""
    url = 'http://ifconfig.me/ip'
    request = urllib2.Request(url)
    request.add_header('Cache-Control','max-age=0')
    response = urllib2.urlopen(request)
    return response.read()

def connect_tor():
    """连接到 TOR 网络并获取 TOR IP 地址"""
    LOCALHOST = "127.0.0.1"
    PORT = 9150

    socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, LOCALHOST, PORT)
    socket.socket = socks.socksocket

    url = 'http://ifconfig.me/ip'
    request = urllib2.Request(url)
    request.add_header('Cache-Control','max-age=0')
    response = urllib2.urlopen(request)
    return response.read()

def compare_ip_addresses(public_ip_address, tor_ip_address):
    """比较公网 IP 地址和 TOR IP 地址"""
    if public_ip_address != tor_ip_address:
        print("IP 地址不同")
    else:
        print("IP 地址相同")

# 调用函数
public_ip_address = public_ip()
tor_ip_address = connect_tor()
compare_ip_addresses(public_ip_address, tor_ip_address)

方法三:在函数中使用参数

def public_ip(ip_address):
    """获取公网 IP 地址"""
    url = 'http://ifconfig.me/ip'
    request = urllib2.Request(url)
    request.add_header('Cache-Control','max-age=0')
    response = urllib2.urlopen(request)
    ip_address = response.read()
    return ip_address

def connect_tor(ip_address):
    """连接到 TOR 网络并获取 TOR IP 地址"""
    LOCALHOST = "127.0.0.1"
    PORT = 9150

    socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, LOCALHOST, PORT)
    socket.socket = socks.socksocket

    url = 'http://ifconfig.me/ip'
    request = urllib2.Request(url)
    request.add_header('Cache-Control','max-age=0')
    response = urllib2.urlopen(request)
    ip_address = response.read()
    return ip_address

def compare_ip_addresses(public_ip_address, tor_ip_address):
    """比较公网 IP 地址和 TOR IP 地址"""
    if public_ip_address != tor_ip_address:
        print("IP 地址不同")
    else:
        print("IP 地址相同")

# 调用函数
public_ip_address = public_ip(None)
tor_ip_address = connect_tor(None)
compare_ip_addresses(public_ip_address, tor_ip_address)

以上三种方法都可以用来比较公网 IP 地址和 TOR IP 地址。第一种方法使用全局变量来传递 IP 地址,第二种方法使用返回值来传递 IP 地址,第三种方法使用参数来传递 IP 地址。这三种方法各有优缺点,用户可以根据自己的需要选择合适的方法。