当前位置:   article > 正文

两年半Python练习生~收藏一份练习,建议收藏_python函数练习

python函数练习

1 数据类型

1.1 求奇、偶数

1、打印10以内的偶数

for i in range(1,10):
    if i % 2 == 0:
        print(i)
  • 1
  • 2
  • 3

执行结果:
在这里插入图片描述
——————————————————————————————————————————————————————
2、打印10以内奇数

list = []
for i in range(1,100):
    if i % 2 != 0:
        list.append(i)
print(list)
  • 1
  • 2
  • 3
  • 4
  • 5

执行结果:
在这里插入图片描述
——————————————————————————————————————————————————————

1.2 生成1-10乘方

list1 = []

for value in range(1,10):
    list1.append(value**2)
print(list1)
  • 1
  • 2
  • 3
  • 4
  • 5

执行结果:
在这里插入图片描述
——————————————————————————————————————————————————————

1.3 求阶乘

一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。比如3的阶乘:321

1 for循环求阶乘

num = int(input("请你输入一个数字:"))
sum = 1
for i in range(1,num+1):
    sum *= i
print(sum)
  • 1
  • 2
  • 3
  • 4
  • 5

执行结果:
在这里插入图片描述

——————————————————————————————————————————————————————
2 递归求阶乘

def recursion_1(num):
    if num == 1:
        return num
    else:
        return num * recursion_1(num - 1)
num = 3
print(recursion_1(num))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

执行结果:
在这里插入图片描述

——————————————————————————————————————————————————————

1.4 生成随机数

random生成随机数方法使用

import random

for i in range(0,5):
    r = random.randint(1,16)
    print(r)
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

——————————————————————————————————————————————————————

1.5 字符串切片

#字符串“The first three items in the list are:”,按空格切分字符串,存入列表

#split方法将字符串按空格切分
p   = "The last three items in the list are"
list1 = p.split()
print(list1)
  • 1
  • 2
  • 3
  • 4

#切片,打印列表前三个元素

for i in list1[0:3]:
    print(i,'\n')
  • 1
  • 2

执行结果:
在这里插入图片描述
——————————————————————————————————————————————————————

1.6 输入Q退出

#只有输入q会退出程序

while True:
    name = input('请输入一个字母:')
    #需要忽略大小写
    name = name.lower()
    if name == 'q':
        print('退出程序')
        break
    else:
        print(f'你输入的字母是{name},请重新输入。')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在这里插入图片描述

——————————————————————————————————————————————————————

1.7 操作列表

(1)索引

索引从0开始
在这里插入图片描述

(2)拼接

将列表元素’name’,‘josh’,‘is’,'my’组合成一句话

name = ['name','josh','is','my']
message = name[3] + ' '+name[0]+' '+name[2]+' '+name[1]
#capitalize首字母大写
print(message.capitalize())
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

(3)修改

修改列表元素值只需要,指定列表名和要修改的元素的索引,再指定该元素的新值
在这里插入图片描述

(4)添加

  1. 在列表末尾添加元素,使用append
name = ['name1','name2','name3']
name.append('jack')
print(name)
  • 1
  • 2
  • 3

在这里插入图片描述
2. 按索引添加列表元素
在索引[0]处,添加Tom

name = ['name1','name2','name3']
name.insert(0,'Tom')
print(name)
  • 1
  • 2
  • 3

在这里插入图片描述

(5)删除

使用del,按索引删除,删除索引0的元素

name = ['Tom','jack','josh']
del name[0]
print(name)
  • 1
  • 2
  • 3

在这里插入图片描述

使用pop()删除,删除完还能用

name = ['Tom','jack','josh']
print(name)
new_name = name.pop()
print(name)
print(new_name)
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

使用remove()按值删除,数据多,不清楚索引,可以按值删除

name = ['Tom','jack','josh']
name.remove('jack')
print(name)
  • 1
  • 2
  • 3

在这里插入图片描述

(6)组织列表

sort()按字母顺序进行正序排序

name = ['dark','allen','coss','bibili']
name.sort()
print(name)
  • 1
  • 2
  • 3

在这里插入图片描述

按倒序排序,向sort()方法传递参数reverse=True

name = ['dark','allen','coss','bibili']
name.sort(reverse=True)
print(name)
  • 1
  • 2
  • 3

在这里插入图片描述

反转列表
在这里插入图片描述

——————————————————————————————————————————————————————

——————————————————————————————————————————————————————

2 函数练习

2.1 函数定义

函数是实现具有特定功能的代码,python中预制了很多内置函数,开发者也可以创建自定义函数。
函数特点:

  1. 隐藏实现功能的细节;
  2. 重用代码;
  3. 提高代码的可读性,便于调试;

函数的定义:


def	函数名(形式参数1,形参2,形参n):

	要运行的代码(函数体)
	
	return 输出的数据(返回值)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

——————————————————————————————————————————————————————

2.2 函数练习:打印诗句

定义一个函数,实现在控制台打印3遍唐诗《绝句》,并使用50个星(*)号分隔每一次打印结果

  1. 定义函数名为ancient_poetry的函数
  2. 函数体内:向控制台输出唐诗《绝句》
  3. 函数体内:向控制台输出50个*号分隔符
  4. 调用三次函数名为ancient_poetry的函数
def ancient_poetry():
    print("鹅鹅鹅,曲项向天歌。白毛浮绿水,红掌拨清波。")
    for i in range(0,50):
        print("*",end='')
    print("\t")

ancient_poetry()
ancient_poetry()
ancient_poetry()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

执行结果:
在这里插入图片描述

——————————————————————————————————————————————————————

2、定义一个函数,里面包含多个形参,并使用50个星(*)号分隔每一次打印结果

def ancient_poetry(poetry_name,is_show_title,is_show_dynasty):
    if poetry_name == "绝句":
        if is_show_title == True:
            print("绝句 杜甫")
        if is_show_dynasty == True:
            print("唐朝")
        print("两个黄鹂鸣翠柳,\n一行白鹭上青天。\n窗含西岭千秋雪,\n门泊东吴万里船。")

        
    
    elif poetry_name=="清平调·其一":
        if is_show_title == True:
            print("\t")
            print("清平调·其一 李白")
        if is_show_dynasty == True:
            print("唐朝")
        print("云想衣裳花想容,\n春风拂槛露华浓。\n若非群玉山头见,\n会向瑶台月下逢。")
        print()
    for i in range(0,50):
        print("*",end='')
        

ancient_poetry("绝句",True ,True)
ancient_poetry("清平调·其一",True, True)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

执行结果:
在这里插入图片描述

——————————————————————————————————————————————————————

2.3 币种汇率计算

简单换算


def calc_exchange_rate(amt,source,target):
          #人民币与美元汇率 :6.3486人民币 ≈  1美元
          # 6.3486:1
    if source == "CNY" and target == "USD":
        result = amt /6.3486
        print("汇率计算成功")
        
        return result

r = calc_exchange_rate(100, "CNY", "USD")
print(r)


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

执行结果:

在这里插入图片描述

关于函数:
#参数是函数的输入数据,而返回值则是函数的输出结果
#程序需要输出,可以用return + 对应的数据(result)进行返回,在外侧使用变量r进行接收即可。
#return不是必须的,但是return语句执行后,函数将中断执行
#实际开发中,最好保证return在函数的最后一行
#r = calc_exchange_rate(100, “EUR”, “USD”) 如果实参"CNY"换成未定义的"EUR"(欧元),打印结果会为None,none在pythoon中代表不存在的含义

——————————————————————————————————————————————————————

实时汇率

1.支持不限制货币版本换算(接受任意的源货币和目标货币)
2.通过调用外部的汇率接口,获取实时最新汇率,并计算汇率。

#pip install requests
#pip install pytz

import requests
from datetime import datetime, timedelta, timezone

def get_exchange_rate(source, target):
    # 汇率 API 的 URL,示例使用的是 Open Exchange Rates API,请根据实际情况更改
    api_url = f"https://open.er-api.com/v6/latest/{source}"

    try:
        # 发送 HTTP 请求获取汇率数据
        response = requests.get(api_url)
        data = response.json()

        # 提取目标货币的汇率
        rates = data.get('rates', {})
        rate = rates.get(target)
        return rate
    except requests.exceptions.RequestException as e:
        print(f"无法获取汇率信息: {e}")
        return None

def calc_exchange_rate(amt, source, target):
    rate = get_exchange_rate(source, target)

    if rate is not None:
        result = amt * rate

        # 获取当前北京时间
        beijing_time = datetime.utcnow().replace(tzinfo=timezone.utc).astimezone(timezone(timedelta(hours=8)))

        print(f"汇率计算成功: {source}{target}, 汇率为 {rate}")
        print(f"当前北京时间: {beijing_time.strftime('%Y-%m-%d %H:%M:%S')}")
        return result
    else:
        print(f"无法计算 {source}{target} 的汇率")
        return None

# 人民币到美元的实时汇率计算
r1 = calc_exchange_rate(100, "CNY", "USD")
print(r1)

# 欧元到美元的实时汇率计算
r2 = calc_exchange_rate(100, "EUR", "USD")
print(r2)

# 日元到美元的实时汇率计算
r3 = calc_exchange_rate(100, "JPY", "USD")
print(r3)


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

执行结果:

在这里插入图片描述

——————————————————————————————————————————————————————

2.4 模拟登录

简单版本
定义一个函数,向函数内传入形参username,password,当username值为josh且password值为字符串josh123时,返回“登录成功”;否则返回“请重新登录”

  1. 定义函数login
  2. if语句判断用户名和密码是否为字符串josh和123456
def login(username,password):
    if username == "josh" and password == "josh123":
        return "登录成功"
    else:
        return "请重新登录"
login_1=login("josh","josh123")
login_2=login("josh1","123456")

print(login_1)
print(login_2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这里插入图片描述

——————————————————————————————————————————————————————

完善版本

class User:
    def __init__(self, username, password):
        # 初始化用户对象
        self.username = username
        self.password = password
        self.login_attempts = 0
        self.is_locked = False

    def login(self, entered_password):
        # 模拟用户登录
        if self.is_locked:
            return "账户已被锁定,请联系管理员解锁"

        if self.password == entered_password:
            # 登录成功,重置登录尝试次数
            self.login_attempts = 0
            return "登录成功"
        else:
            # 登录失败,记录尝试次数
            self.login_attempts += 1
            if self.login_attempts >= 3:
                # 登录失败次数过多,锁定账户
                self.is_locked = True
                return "登录失败次数过多,账户已被锁定"
            else:
                # 还剩余尝试次数
                remaining_attempts = 3 - self.login_attempts
                return f"登录失败,还剩余 {remaining_attempts} 次尝试"


def interactive_login():
    # 创建用户对象(这里假设用户名和密码是固定的,你可以根据实际情况修改)
    user = User("josh", "josh123")

    # 循环,直到登录成功或达到最大尝试次数
    while True:
        # 通过交互式输入获取用户名和密码
        username = input("请输入用户名: ")
        password = input("请输入密码: ")

        # 进行登录尝试,并输出结果
        result = user.login(password)
        print(result)

        # 如果登录成功或达到最大尝试次数,跳出循环
        if result == "登录成功" or user.is_locked:
            break


# 通过交互式输入进行登录尝试
interactive_login()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

执行结果:
在这里插入图片描述

——————————————————————————————————————————————————————

隐藏密码版本

下面是与显示密码版本相比,修改后用 getpass 隐藏密码的部分:

#导入 getpass 模块
import getpass

#使用 getpass.getpass 获取密码:
password = getpass.getpass("请输入密码: ")
  • 1
  • 2
  • 3
  • 4
  • 5

这两处是对比之前显示密码版本的修改,getpass.getpass 函数用于在终端中获取密码,而不显示输入的字符。

执行结果:
这样,用户在输入密码时不会被其他人看到。
在这里插入图片描述

——————————————————————————————————————————————————————

2.5 函数使用技巧

函数使用技巧1-1:

设置参数默认值:只需要在形参后增加 “=具体值”即可;

def calc_exchange_rate(amt, source, target='USD'):
        #target='USD' 将USD设置为默认参数值

# 人民币与美元汇率 :6.3486人民币 ≈  1美元
# 6.3486:1
    if source == "CNY" and target == "USD":
        result = amt / 6.3486
        print("美元汇率计算成功")
        return result
#7.241人民币 ≈  1欧元
#7.241 :1
    elif source == "CNY" and target == "EUR":
        result = amt /7.241
        print("欧元汇率计算成功")
        return result

r = calc_exchange_rate(100, "CNY")
# r = calc_exchange_rate(100, "EUR", "USD") 如果实参"CNY"换成未定义的"EUR"(欧元),打印结果会为None,none在pythoon中代表不存在的含义
print(r)

r1 = calc_exchange_rate(100,"CNY","EUR")
print(r1)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

执行结果:

在这里插入图片描述
——————————————————————————————————————————————————————

函数使用技巧1-2:

(关键字传参),以形参形式传参也叫关键字传参,

#2、以形参形式传参(也叫关键字传参):
# 定义一个体检的函数,里面包含姓名,年龄,身高等;
'''
def health_check(name,age,height,weight.5,hr,hhp,lbp,glu):
health_check("josh",25,175,80.5,70,120,80,4.3)
此种定义方式,如果单行看,根本无法得知传递的health_check("josh",25,175...)为何物,所以需要使用以形参形式传参传参
而在一个函数内包含如此多的形参时,最好的方式是使用字典
'''
def health_check(name,age,height,weight,hr,hhp,lbp,glu):
    print("您的健康状况良好")
health_check("josh",25,175,80.5,70,120,80,4.3)
health_check(name="josh",age="18",height=170,weight=80.5,hr=70,hhp=120,lbp=80,glu=4.3)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

执行结果:
在这里插入图片描述

——————————————————————————————————————————————————————

函数使用技巧1-3:

以混合形式传参

#3、混合形式传参
def health_check1(name,age,*,height,weight,hr,hhp,lbp,glu):
    #*代表之后的所有参数传参时必须使用关键字传参
    print("您的健康状况良好")

'''health_check1(name="josh", age="25", 170, weight=80.5, hr=70, hhp=120, lbp=80, glu=4.3)
    注释:这段代码表示,如传参时,age后的height 170不使用关键字传参就会报错,程序无法执行'''
health_check1(name="josh",age="18",height=170,weight=80.5,hr=70,hhp=120,lbp=80,glu=4.3)
    #按关键字传参则执行成功
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

——————————————————————————————————————————————————————

序列传参

def calc(a,b,c):
    return a+b+c

print(calc(1,2,3))
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

——————————————————————————————————————————————————————

2.6 format用法

定义info函数,使用format格式化字符串向控制台输出"python-程序员的梦工厂出生于2021年1月"

1、使用format格式化字符串向控制台输出"-程序员的梦工厂出生于2021年1月"
2、调用函数,向函数内传入(程序员的梦工厂,2013年8月)
3、在函数传参时,*号之后的所有参数必须使用关键字传参
‘’’

def info(*,name="python",content,time):

    print("{p1}-{p2}出生于{p3}".format(p1=name,p2=content,p3=time))
info(content="-程序员的梦工厂出生于",time="2021年1月")
  • 1
  • 2
  • 3
  • 4

执行结果:
在这里插入图片描述

——————————————————————————————————————————————————————

3 文件操作

3.1 创建.txt文件

  1. 设计一个函数,在桌面上创建9个.txt文件,并以数字1-9.txt命名
def file_creation():
    path = 'C:/Users/Josh/Desktop/'
    for file_name in range(1,10):
        with open(path + str(file_name) + '.txt', 'w' ) as file:
            #file.write(str(file_name))
            file.write('hello world')
            print(f'File created:{path}{file_name}.txt')

file_creation()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

注意点: 需要将文件生成的路径修改实际路径

执行结果:
在这里插入图片描述

——————————————————————————————————————————————————————

3.2 删除文件

删除桌面上的所有txt文件

import os
import glob

#定义搜索条件
pattern = '*.txt'

#获取桌面路径
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")

#使用glob模块查找所有的匹配文件
txt_files = glob.glob(os.path.join(desktop_path,pattern))

#遍历找到的所有文件,删除它们
for file in txt_files:
    try:
        os.remove(file)
        print(f"文件 {file} 已被删除")
    except OSError as e:
        print(f"删除文件 {file} 时出错:{e}")
        
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

执行结果:

在这里插入图片描述

——————————————————————————————————————————————————————

3.3 读取文件

读取桌面的.txt文件,并写入列表,打印值。

def file_txt():
    filenames_path = r'C:/Users/Josh/Desktop/test.txt'
    with open(filenames_path,encoding='utf-8') as f:
    	#readlines()方法返回值每行都是列表元素
        rest = f.readlines()
        
        #打印行数
        print(len(rest))
        print(rest)

if __name__ == '__main__':
    file_txt()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

执行结果:
在这里插入图片描述

——————————————————————————————————————————————————————

4 网络

4.1 中国(CN)IP网段获取

Apnic是全球5个地区级的Internet注册机构(RIR)之一,负责亚太地区的以下一些事务:
(1)分配IPv4和IPv6地址空间,AS号
(2)为亚太地区维护Whois数据库
(3)反向DNS指派
(4)在全球范围内作为亚太地区的Internet社区的代表

文件包含亚太地区所有IP网段(每天更新):

在这里插入图片描述

在脚本中,我们使用了 |CN|ipv4 这个条件来过滤出中国(CN)的IPv4地址段。

#pip install requests
import os
import requests
from math import log2
from datetime import datetime

# 下载数据文件
url = "http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest"
response = requests.get(url)
data = response.text

# 指定保存文件的路径
download_folder = "C:/Users/Josh/Downloads"
filename = os.path.join(download_folder, f"delegated-apnic-latest.txt")

# 保存下载的数据到文件
with open(filename, 'w') as file:
    file.write(data)

# 处理数据并生成地址列表
lines = data.split('\n')
address_list = []
for line in lines:
    if "|CN|ipv4" in line:
        parts = line.split('|')
        ip_start = parts[3]
        prefix_length = 32 - int(log2(int(parts[4])))
        address = f"add address={ip_start}/{prefix_length} disabled=no list=zh-ip"
        address_list.append(address)

# 保存结果到文件
output_filename = os.path.join(download_folder, f"address-list_{datetime.now().strftime('%Y%m%d')}.rsc")
with open(output_filename, 'w') as file:
    file.write("/ip firewall address-list\n")
    file.write('\n'.join(address_list))

print(f"生成地址列表文件:{output_filename}")

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

文件内容格式:

此格式我所知,可用于MikroTik RouterOS软路由,导入 IPV4地址段使用。
在这里插入图片描述
提取网段内容

将1.0.1.0/24类似内容提取出来

import re

def extract_ip_addresses(input_file_path, output_file_path):
    # 打开输入文件以进行读取
    with open(input_file_path, 'r', encoding='utf-8') as input_file:
        # 读取输入文件的所有行并将它们存储在 'lines' 列表中
        lines = input_file.readlines()

    # 使用正则表达式提取以 'add address=' 开头的行中的IP地址
    ip_addresses = [re.search(r'add address=(\S+)', line).group(1) for line in lines if line.startswith('add address=')]

    # 打开输出文件以进行写入
    with open(output_file_path, 'w', encoding='utf-8') as output_file:
        # 将每个提取出的IP地址写入输出文件的新行
        for ip_address in ip_addresses:
            output_file.write(ip_address + '\n')

if __name__ == '__main__':
    # 设置输入和输出文件的路径,用于转换
    input_path = r'C:/Users/Josh/Downloads/address-list_20231124.rsc'
    output_path = r'C:/Users/Josh/Downloads/extracted_addresses.txt'

    # 调用函数以提取和保存IP地址
    extract_ip_addresses(input_path, output_path)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

执行结果:

在这里插入图片描述
——————————————————————————————————————————————————————

4.2 paramiko 之ssh远程linux

  1. ssh远程登录linux
  2. 执行hostname命令查看主机名
import paramiko

def sshExeCMD():
    # 创建ssh客户端工具
    ssh_client = paramiko.SSHClient()
    # 设置丢失主机key时的策略为自动添加know hosts
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    # 连接远程主机
    ssh_client.connect(hostname="192.168.31.223",port=22,username="root",password="123456")
    stdin, stdout, stderr = ssh_client.exec_command("ifconfig")
    for line in stdout:
        print('Line: ', line.strip('\n'))  # 打印出每一行
    ssh_client.close()

if __name__ == '__main__':
    sshExeCMD()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

执行结果:
在这里插入图片描述

——————————————————————————————————————————————————————

4.3 远程执行命令:ifconfig eth0

import paramiko

def sshExeCMD():
    # 创建ssh客户端工具
    ssh_client = paramiko.SSHClient()
    # 设置丢失主机key时的策略为自动添加know hosts
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    # 连接远程主机
    ssh_client.connect(hostname="192.168.31.223",port=22,username="root",password="123456")
    stdin, stdout, stderr = ssh_client.exec_command("ifconfig eth0")
    for line in stdout:
        print('Line: ', line.strip('\n'))  # 打印出每一行
    ssh_client.close()

if __name__ == '__main__':
    sshExeCMD()



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

在这里插入图片描述

——————————————————————————————————————————————————————

4.4 多服务器执行:df -hT

import paramiko
import sys

def sshExeCMD(ip,username,password,port):
    ssh_client = paramiko.SSHClient()
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    try:
        ssh_client.connect(hostname=ip,port=port,username=username,password=password)
    except Exception as e:
        print("连接服务器%s失败,请检查ip地址和端口是否正确!" % ip)
        print(e)
        sys.exit(1)

    stdin,stdout,stderr = ssh_client.exec_command("df -hT")
    print("服务器%s磁盘信息:" % ip)
    print(stdout.read().decode('utf-8'))

    ssh_client.close()  # 注意这里,我们已经修复了关闭客户端的方法

if __name__ == '__main__':
    servers = {
        "192.168.31.223":{
            "username":"root",
            "password":"123456",
            "port":22
        },
        "192.168.31.162":{
            "username":"root",
            "password":"123456",
            "port":22
        }
    }
    for ip,info in servers.items():
        sshExeCMD(
            ip = ip,
            username = info.get("username"),
            password = info.get("password"),
            port = info.get("port")
        )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

执行结果:
在这里插入图片描述
——————————————————————————————————————————————————————

4.5 command 命令通过参数传递,灵活

import paramiko
import sys

def sshExeCMD(ip,username,password,port,command):
    ssh_client = paramiko.SSHClient()
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())



    try:
        ssh_client.connect(
            hostname=ip,
            port=port,
            username=username,
            password=password
            )
    except Exception as e:
        print("连接服务器%s失败,请检查ip地址和端口是否正确!" % ip)
        print(e)
        sys.exit(1)

    stdin,stdout,stderr = ssh_client.exec_command(command)
    print("服务器%s执行结果:" % ip)
    print(stdout.read().decode('utf-8'))

    ssh_client.close()



if __name__ == '__main__':
    servers = {
        "192.168.31.223":{
            "username":"root",
            "password":"123456",
            "port":22
        },
        "192.168.31.162":{
            "username":"root",
            "password":"123456",
            "port":22
        }
    }
    command_to_execcute = "netstat -tnlp"      #ssh执行的命令
    for ip,info in servers.items():
        sshExeCMD(
            ip = ip,
            username = info.get("username"),
            password = info.get("password"),
            port = info.get("port"),
            command=command_to_execcute
        )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

执行结果:
在这里插入图片描述

——————————————————————————————————————————————————————

——————————————————————————————————————————————————————

4.6 mysql数据库存放server_info

首先,确保mysql服务器正常连接,并且需要已经安装好有一个mysql数据库,

创建数据库信息:
首先,你需要创建一个新的数据库,用于存储服务器的登录信息。你可以选择一个适当的数据库名称,比如ip_info。

#创建数据库ip_info
CREATE DATABASE ip_info;

#进入ip_info
use ip_info;


#创建表:在数据库中创建一个名为servers的表。这个表应该包含以下字段:
1、id:自增的唯一标识符,作为主键。
2、ip:服务器的IP地址。
3、name:服务器的用户名。
4、password:服务器的密码。
5、port:服务器的SSH端口号。

CREATE TABLE servers(
	id int AUTO_INCREMENT PRIMARY KEY,
	ip VARCHAR(255) NOT NULL,
	name VARCHAR(255) NOT NULL,
	password VARCHAR(255) NOT NULL,
	port INT NOT NULL
	
);


#插入服务器信息
INSERT INTO servers(ip,name,password,port) VALUES('192.168.31.223','root','123456',22);
select * from servers;
INSERT INTO servers(ip,name,password,port) VALUES('192.168.31.162','root','123456',22);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

python代码:

import paramiko
import sys
import mysql.connector

def get_server_info_from_db():
    # 连接MySQL数据库
    db = mysql.connector.connect(
        host="192.168.31.223",  # 数据库主机地址
        user="root",            # 数据库用户名
        password="123456",      # 数据库密码
        database="ip_info"      # 数据库名称
    )
    cursor = db.cursor()

    # 执行查询语句,获取服务器登录信息
    query = "SELECT ip, name, password, port FROM servers"  # 假设你的表名为servers
    cursor.execute(query)
    results = cursor.fetchall()

    servers = {}
    for result in results:
        ip, name, password, port = result
        servers[ip] = {
            "username": name,
            "password": password,
            "port": port
        }
    
    cursor.close()
    db.close()
    
    print("成功从数据库调取server_info")  # 添加这行打印语句来确认成功调取信息
    return servers

def sshExeCMD(ip, username, password, port, command):
    ssh_client = paramiko.SSHClient()
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    try:
        ssh_client.connect(
            hostname=ip,
            port=port,
            username=username,
            password=password
        )
    except Exception as e:
        print("连接服务器%s失败,请检查ip地址和端口是否正确!" % ip)
        print(e)
        sys.exit(1)

    stdin, stdout, stderr = ssh_client.exec_command(command)
    print("服务器%s执行结果:" % ip)
    print(stdout.read().decode('utf-8'))
    ssh_client.close()

if __name__ == '__main__':
    servers = get_server_info_from_db()  # 从数据库中获取服务器登录信息
    command_to_execcute = "netstat -tnlp"  # ssh执行的命令
    for ip, info in servers.items():
        sshExeCMD(
            ip=ip,
            username=info.get("username"),
            password=info.get("password"),
            port=info.get("port"),
            command=command_to_execcute
        )

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67

执行结果:

在这里插入图片描述

5 排序

5.1 冒泡排序

def bubble_sort(arr):
    n = len(arr)
    # 遍历所有数组元素
    for i in range(n):
        # 最后 i 个元素已经排好序,不需要再比较
        for j in range(n-i-1):
            # 如果当前元素比下一个元素大,则交换它们的位置
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    return arr
arr = [64, 34, 25, 12, 22, 11, 90]
bubble_sort(arr)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

执行结果
在这里插入图片描述

——————————————————————————————————————————————————————

6 while循环

6.1 continue用法

#演示continue用法

number = 10
while number >=1:
    number -=1
    if number == 5:     #等于5时,跳过当前循环
        continue
    print(f"number is {number}")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述
——————————————————————————————————————————————————————

6.2 break用法

num = 10
while num >=1:
    num -= 1
    if num == 5:
        break
    print(f'num is {num}')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

——————————————————————————————————————————————————————

7 API调用

7.1 open api key调用

  1. 获取openai key
    打开地址: https://platform.openai.com/api-keys

  2. 创建新的key
    在这里插入图片描述
    点一下右侧的复制即可
    在这里插入图片描述

  3. 将apikey 添加到系统的环境变量,并重启主机生效。
    在这里插入图片描述

调用脚本

import openai
import os

openai.api_key = os.getenv("OPEN_API_KEY")

completion = openai.ChatCompletion.create(
    model = "gpt-3.5-turbo-16k",
    messages=[
        {"role":"user","content": "hi,who are you?"}
    ]
)

print(completion.choices[0].message)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

执行结果:

在这里插入图片描述

7.2 文心一言api key调用

在这里插入图片描述

import requests
import json

API_KEY = "你的apikey"
SECRET_KEY = "你的secrkt-key"


def main():
    url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=" + get_access_token()

    payload = json.dumps({
        "messages": [
            {
                "role": "user",
                "content": "你好"
            }
        ]
    })
    headers = {
        'Content-Type': 'application/json'
    }
    response = requests.request("POST", url, headers=headers, data=payload)
    print(json.dumps(json.loads(response.text), indent=4, ensure_ascii=False))


def get_access_token():
    url = "https://aip.baidubce.com/oauth/2.0/token"
    params = {"grant_type": "client_credentials", "client_id": API_KEY, "client_secret": SECRET_KEY}
    return str(requests.post(url, params=params).json().get("access_token"))


if __name__ == '__main__':
    main()


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

8 爬虫

8.1 爬取小说(斗罗大陆)

import requests
from lxml import etree
from urllib.parse import urljoin  # 导入urljoin

# 初始URL
url = 'https://www.51shucheng.net/wangluo/douluodalu/21750.html'

while True:
    #用户代理头
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'
    }

    # 发送GET请求
    resp = requests.get(url, headers=headers)

    # 设置编码
    resp.encoding = 'utf-8'

    # 解析HTML响应
    e = etree.HTML(resp.text)
    info = ' '.join(e.xpath('//div/p//text()'))
    title = e.xpath('//h1/text()')[0]

    # 打印和保存章节内容
    print(title)
    with open('斗罗大陆.txt', 'a', encoding='utf-8') as f:
        f.write(title + '\n\n' + info + '\n\n')

    # 使用urljoin查找下一章的URL
    next_chapter_url = e.xpath('//*[@id="BookNext"]/@href')
    if not next_chapter_url:
        print("没有更多章节可用。")
        break

    # 使用urljoin更新下一个URL,以确保正确构建URL
    url = urljoin(url, next_chapter_url[0])

print("已经抓取并保存了所有章节到斗罗大陆.txt文件中。")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

代码执行结果:

获取的章节显示:
在这里插入图片描述

斗罗大陆txt文件内容如下:
在这里插入图片描述
小说拉取完成,最底部显示如下:
在这里插入图片描述

11 小游戏

11.1 摇骰子简单游戏

  • 构建摇色子的函数,需要摇3个塞子,每个塞子都生成1~6的随机数;
  • 创建1个列表,把摇塞子的结果存储在列表,并且每局都更换结果,每次游戏开始前,列表被清空一次;
  • 3个塞子的分别的点数,要转换为‘大’或‘小’,11<=总值<=18 为大,3<=总值<=10为小
  • 最后让用户猜大小,如果猜对告诉用户赢得结果,如果猜错就告诉用户输的结果
import random
def roll_dice(numbers=3,points=None):
    print('<<<ROLL THE DICE!>>>')
    if points is None:
        points=[]
    while numbers>0:
        point =random.randrange(1,7)
        points.append(point)
        numbers = numbers-1
    return points

def roll_result(total):
    isBig=11<=total<=18
    isSmall=3<=total<=10
    if isBig:
        return 'Big'
    if isSmall:
        return 'Small'

def start_game():
    print('<<<GAME STARTS!>>>')
    choices = ['Big','Small']
    your_choices =input('Big or Small: ')
    if your_choices in choices:
        points = roll_dice()
        total = sum(points)
        youWin = your_choices == roll_result(total)
        if youWin:
            print('The points are ',points,'You Win !')
        else:
            print('The points are ',points,'You lose !')
    else:
        print('Invalid Words')
        start_game()
start_game()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

12 数据库

12.1 验证mysql状态

仅验证mysql数据库当前状态是否在线,查看版本或执行其他命令

import pymysql

db = pymysql.connect(
    host='192.168.31.223',
    port=3306,
    user='root',
    password='数据库密码',
    db='mysql',
    charset='utf8'
)

cursor=db.cursor()


#获取数据库版本
cursor.execute("select version()")
data = cursor.fetchone()
print("数据库连接正常,数据库版本是:%s" %data[0])

db.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

执行结果:
在这里插入图片描述
对比mysql执行:
在这里插入图片描述
——————————————————————————————————————————————————————

12.2 mysql查询

import pymysql

db = pymysql.connect(
    host='192.168.31.223',
    port=3306,
    user='root',
    password='数据库密码',
    db='mysql',
    charset='utf8'
)


cursor=db.cursor()
cursor.execute("select version()")
cursor.execute("use atguigudb")
cursor.execute("show databases")



#查询并打印所有数据
result = cursor.fetchall()
for row in result:
    print(row)



#获取数据库版本
cursor.execute("select version()")
data = cursor.fetchone()
print("数据库连接正常,数据库版本是:%s" %data[0])

db.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

执行结果:
在这里插入图片描述

——————————————————————————————————————————————————————

12.3 mysql增删改

#pip install pymysql  提前导入pymysql
import pymysql

#登录数据库的信息
db = pymysql.connect(
    host='192.168.31.223',
    port=3306,
    user='连接数据库的账号',
    password='连接数据库的密码',
    db='mysql',
    charset='utf8'
)

#执行基本的数据库命令
cursor=db.cursor()
cursor.execute("select version()")
cursor.execute("show databases")
cursor.execute("use atguigudb")
cursor.execute("show tables")

#查询数据
select_query = "select * from jobs"
cursor.execute(select_query)

#除了查询,其他修改操作需要db.commit()提交事务
#插入数据
insert_query =  "INSERT INTO jobs(job_id,job_title,min_salary,max_salary) VALUES ('JOSH_ID_21','Operition',10000,15000)"
cursor.execute(insert_query)
db.commit()     


#修改数据
update_query = "UPDATE jobs set min_salary=11000,max_salary=12000 WHERE job_id='JOSH_ID_11'"
cursor.execute(update_query)
db.commit()

#删除数据
delete_query = "DELETE FROM jobs WHERE job_id='JOSH_ID_10'"
cursor.execute(delete_query)
db.commit()



result = cursor.fetchall()
for row in result:
    print(row)

#获取mysql版本
cursor.execute("select version()")
data = cursor.fetchone()
print("数据库连接正常,数据库版本是:%s" %data[0])

db.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

数据库-表结构如图:
在这里插入图片描述
——————————————————————————————————————————————————————

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/539798
推荐阅读
相关标签
  

闽ICP备14008679号