编写程序,生成一个包含20个范围在 [0,100] 内的随机整数的列表,然后将前10个元素升序排列,后10个元素降序排列,并输出结果。以下是部分程序,请补充。
import random
#生成一个包含20个范围在 [0,100] 内的随机整数的列表
x=[random.randint(0, 100) for i in range(20)]
#在这里编写代码,将排序后的列表存放在变量 x 中
可以使用Python内置的sorted()函数来实现列表的排序,其中reverse参数可以控制排序的顺序。下面是完整的代码:
import random # 导入random模块,用于生成随机数
#生成一个包含20个范围在[0,100]内的随机整数的列表
x = [random.randint(0, 100) for i in range(20)] # 列表推导式,生成20个随机整数,并存放在列表x中
#将前10个元素升序排列
x[:10] = sorted(x[:10]) # 取出前10个元素并升序排列,再将排序后的结果赋值给原来的前10个元素
#将后10个元素降序排列
x[10:] = sorted(x[10:], reverse=True) # 取出后10个元素并降序排列,再将排序后的结果赋值给原来的后10个元素
print(x) # 打印输出列表x的结果
在这个程序中,我们首先使用列表推导式生成一个包含20个范围在[0,100]内的随机整数的列表。然后使用切片操作将前10个元素取出来,对其使用sorted()函数进行升序排列,再将结果赋值回原来的列表中。接着用类似的方式对后10个元素进行降序排列。最后输出结果。
import random
#生成一个包含20个范围在 [0,100] 内的随机整数的列表
x=[random.randint(0, 100) for i in range(20)]
#在这里编写代码,将排序后的列表存放在变量 x 中
#将前10个元素升序排列
x[:10] = sorted(x[:10], reverse=False)
#将后10个元素降序排列
x[10:] = sorted(x[10:], reverse=True)
#输出结果
print(x)
参考一下这个,自己研究一下应该可以的,不懂的也可以私信我
import random
# 生成一个包含20个范围在 [0,100] 内的随机整数的列表
x = [random.randint(0, 100) for i in range(20)]
# 对前10个元素进行升序排序
x[:10] = sorted(x[:10])
# 对后10个元素进行降序排序
x[10:] = sorted(x[10:], reverse=True)
# 输出排序后的列表
print(x)
将前10个元素升序排列
x[:10] = sorted(x[:10])
后10个元素降序排列
x[10:] = sorted(x[10:], reverse=True)
输出结果
print(x)
2. 尝试修改例6.2编写的命令行参数解析的程序,解析命令行参数所输入边长的值,计算并输出正方形的周长和面积
argparse模块用于解析命名的命令行参数,生成帮助信息的Python标准模块
例6.2:解析命令行参数所输入的长和宽的值,计算并输出长方形的面积
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--length', default = 10, type = int, help = '长度')
parser.add_argument('--width', default = 5, type = int, help = '宽度')
args = parser.parse_args()
area = args.length * args.width
print('面积 = ', area)
input()#加这一句是为了可以看到输出结果
输出:面积 = 50
如果在执行这个模块时,加入两个命令行参数
输出:面积 = 36
基本上看了上面这个例子后,就可以理解argparse的用法了
本题代码:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--length', default = 10, type = int, help = '长度')
args = parser.parse_args()
area = args.length ** 2
perimeter = 4 * args.length
print('面积 = {0},周长 = {1}'.format(area,perimeter))
input()#加这一句是为了可以看到输出结果
在PowerShell中输入.\test.py
不给命令行参数,输出是以默认值来计算的
输出:面积 = 100,周长 = 40
给命令行参数:.\test.py --length 1
输出:面积 = 1,周长 = 4
3. 尝试修改例6.8编写读取并输出文本文件的程序,由命令行第一个参数确认所需输出的文本文件名
f = open(file, mode = 'r' , buffering = -1, encoding = None)
- file是要打开或创建的文件名,如果文件不在当前路径,需指出具体路径
- mode是打开文件的模式,模式有:
‘r’(只读)
‘w’(写入,写入前删除就内容)
‘x’(创建新文件,如果文件存在,则导致FileExistsError)
‘a’(追加)
‘b’(二进制文件)
‘t’(文本文件,默认值)
‘+’(更新,读写)- buffering表示是否使用缓存(缓存为-1,表示使用系统默认的缓冲区大小)
- encoding是文件的编码
例6.8:读取并输出文本文件
import sys
filename = sys.argv[0]#就读取本文件,骚的呀皮
f = open(filename, 'r', encoding = 'utf-8')
line_no = 0
while True:
line_no += 1
line = f.readline()
if line:
print(line_no, ":", line)
else:
break
f.close()
输出(代码输出的就是本python文件):
1 : import sys
2 :
3 : filename = sys.argv[0]#就读取本文件,骚的呀皮
4 : f = open(filename, 'r', encoding = 'utf-8')
5 :
6 : line_no = 0
7 : while True:
8 : line_no += 1
9 : line = f.readline()
10 : if line:
11 : print(line_no, ":", line)
12 : else:
13 : break
14 : f.close()
15 :
本题代码:
对例题代码进行些许修改就可以了,首先将上例中的第二个语句改为:filename = sys.argv[0]
,再考虑下面怎么进行
准备一个用来测试的文件test.txt:
对于这个文件要注意一点(你们很可能回出现这个问题!!!),win10默认创建的文本文件的字符编码是ANSI
代码怎么写,有两种:
f = open(filename, 'r', encoding = 'ANSI')
在PowerShell中输入:./test.py test.txt
输出:
1 : 大家好
2 : 我是Zhangguohao666
3 : 如果本文章对大家有帮助,请点赞支持一下
4 : 还有:
5 : 如果发现了什么问题,请在评论区指出,我会积极改进
4. 尝试修改例6.9编写利用with语句读取并输出文本文件的程序,由命令行第一个参数确认所需输出的文本文件名
为了简化操作,Python语言中与资源相关的对象可以实现上下文管理协议,可以使用with语句,确保释放资源。
with open(file,mode) as f:
例6.9:利用with语句读取并输出文本文件
import sys
filename = sys.argv[0]
line_no = 0
with open(filename, 'r', encoding = 'utf-8') as f:
for line in f:
line_no += 1
print(line_no, ":", line)
f.close()
基本上,看这个例子,就可以上手with语句了
本题代码:
还是上一题准备的文本文件,
代码一(文本文件的编码为默认的ANSI):
import sys
filename = sys.argv[1]
line_no = 0
with open(filename, 'r', encoding = 'ANSI') as f:
for line in f:
line_no += 1
print(line_no, ":", line)
f.close()
代码二(将文本文件的编码修改为utf-8):
import sys
filename = sys.argv[1]
line_no = 0
with open(filename, 'r', encoding = 'utf-8') as f:
for line in f:
line_no += 1
print(line_no, ":", line)
f.close()
本题的输出,我再不要脸的放一次吧:
1 : 大家好
2 : 我是Zhangguohao666
3 : 如果本文章对大家有帮助,请点赞支持一下
4 : 还有:
5 : 如果发现了什么问题,请在评论区指出,我会积极改进
5. 尝试修改例6.12编写标准输出流重定向的程序,从命令行第一个参数中获取n的值,然后将0-n,0-n的2倍值,2的0-n次幂的列表打印输出到out.log文件中
例6.12:从命令行第一个参数中获取n的值,然后将0-n,2的0-n次幂的列表打印输出到out.log文件中
- 标准输入流文件对象:sys.stdin,
默认值为sys.__stdin__
- 标准输出流文件对象:sys.stdout,
默认值为sys.__stdout__
- 错误输出流文件对象(标准错误流文件对象):sys.stderr
默认值为sys.__stderr__
书中给的代码是这样的:
import sys
n = int(sys.argv[1])
power = 1
i = 0
f = open('out.log', 'w')
sys.stdout = f
while i <= n:
print(str(i), ' ', str(power))
power = 2*power
i += 1
sys.stdout = sys.__stdout__
如果使用的编辑器是PyCharm(现在大多数编辑器会帮你对代码进行优化和处理一些隐患),运行书中的这个代码没有问题。
但是:
若使用的编辑器是python自带的IDLE,运行这个代码有问题!
第一:out.log文件会生成,但是没有东西
(发现文件关闭不了(就是×不掉),
确定是文件没关闭(f.close())的原因)
第二:控制台没有输出’done’语句(估计是IDLE编辑器处理不了__stdout__
这个值)
经过研究后,发现(基于IDLE编辑器):
如果在上面的代码中加入f.close()
后,该输入的东西都成功输入进out.log文件了,
但是,
还有一个问题
控制台依旧没有输出’done’语句
经过一步步的断点调试(就是手动写print)
发现sys.stdout = sys.__stdout__
不会执行
然后进行改动后,就可以了,代码如下:
(既然__stdout__
不好使,就使用中间变量)
import sys
n = int(sys.argv[1])
power = 1
i = 0
output = sys.stdout
f = open('out.log', 'w')
sys.stdout = f
while i <= n:
print(str(i), ' ', str(power))
power = 2*power
i += 1
f.close()
sys.stdout = output
print('done!')#这一句是用来检测上面的代码是否成功执行
问题虽然解决,但是原因没有彻底弄清楚,求助。。。。。。
本题代码:
import sys
n = int(sys.argv[1])
power = 1
i = 0
output = sys.stdout
f = open('out.log', 'w')
sys.stdout = f
while i <= n:
print(str(i), ' ', str(2*i), ' ', str(power))
power = 2*power
i += 1
f.close()
sys.stdout = output
print('done!')#这一句是用来检测上面的代码是否成功执行
比如时输入的命令行参数是6
输出:
#然后将前10个元素进行升序排序
x[0:10] = sorted(x[0:10])
# 后10个元素降序排列:reverse表示降序
x[10:] = sorted(x[10:], reverse=True)
# 输出结果
print(x)
输出结果:
引用chatGPT作答,可以使用 Python 内置函数 sorted() 和 reverse=True 参数来对列表进行升序和降序排序。代码如下:
import random
# 生成一个包含20个范围在 [0,100] 内的随机整数的列表
x = [random.randint(0, 100) for i in range(20)]
# 对前10个元素进行升序排序
x[:10] = sorted(x[:10])
# 对后10个元素进行降序排序
x[10:] = sorted(x[10:], reverse=True)
# 输出结果
print(x)
输出结果可能类似于:
[2, 6, 13, 15, 25, 36, 39, 54, 62, 87, 91, 89, 86, 75, 71, 56, 45, 31, 25, 2]
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import random
list_1 = []
list_2 = []
list_3 = []
for i in range(20):
#随机产生20个0-100整数
list_1.append(random.randint(0,100)
print('生成的随机整数列表为:\n',list_1)
#分片
list_2 = list_1[0:10]
list_3 = list_1[10:20]
#升序排序
list_2.sort()
#降序排序
list_3.sort()
list_3.reverse()
#列表合并
list_1 = list_2 + list_3
print('排序后的列表为:\n',list_1)