pyhton怎么通过函数方式实现随机输入一个数字,计算该数字范围内所有数字的总和或者乘积。即要求函数实现的功能:既可以求和又可以求乘积,且求乘积不能等于0
from math import factorial
def fun(n):
return sum(range(n+1)), factorial(n)
n = int(input())
print(*fun(n))
啥叫求总和或乘积
是同时求两个数然后返回2个结果吗,或者是啥意思,到底执行什么
# -*- coding:utf-8 -*-
#上面一行是为了说明是 utf-8 编码
import time
import requests
import pymysql
from MyQR import myqr
from pyquery import PyQuery as pq
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common. keys import Keys
from selenium. webdriver. support import expected_conditions as EC
from selenium. webdriver. support .wait import WebDriverWait
# 其实在这里我偷了个懒,实现自动翻页的方法太过简单
# 这里还需要对应你的浏览器下载 驱动
driver = webdriver.Chrome()
j = 1
for j in range(1, 6):
num = 1 * j
str_num = str(num)
ss = 'pn' + str_num
url = 'https://sjz.58.com/tech/' + ss + '/?PGTID=0d202408-000f-1ba4-ea49-9ee4629b6fa3&ClickID=2'
#仿造成浏览器访问的假象
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/55.0.2883.87 Safari/537.36'}
Response = requests.get(url, headers=headers)
driver.get(url)
doc = pq(driver.page_source, parser='html')
#Css选择器 选择一下需要抓取的东西
address = doc('.address')
job_name = doc('.name')
job_salary = doc('.job_salary')
compary_name = doc('.comp_name')
s_address = []
s_job_name = []
s_job_salary = []
s_compary_name = []
for x in address.items():
s_address.append(x.text())
for x in job_name.items():
s_job_name.append(x.text())
for x in job_salary.items():
s_job_salary.append(x.text())
for x in compary_name.items():
s_compary_name.append(x.text())
# 连接数据库
db = pymysql.connect("localhost", "root", "123456", "Test")
cursor = db.cursor()
# 建表--IT
#这个j 的赋值,实际上是为只建一次表
try:
if j == 1:
cursor.execute("DROP TABLE IF EXISTS IT")
sql = """CREATE TABLE IT (
ID int PRIMARY KEY AUTO_INCREMENT,
s_addr VARCHAR(255),
s_job_name VARCHAR(255),
s_job_salary VARCHAR(255),
s_compary_name VARCHAR(255)
);"""
cursor.execute(sql)
cursor.close()
except:
#如果不成功进行数据回滚
db.rollback()
cursor.close()
i = 0
# 插入数据--IT
for i in range(len(s_job_name)):
try:
sql = '''INSERT INTO IT VALUES(null,%s,%s,%s,%s)'''
cursor = db.cursor()
cursor.execute(sql, (s_address[i], s_job_name[i], s_job_salary[i], s_compary_name[i]))
db.commit()
except:
db.rollback()
cursor.close()
#这个是为防止爬取过快被检测到
time.sleep(4)
# 查询
while 1:
Num1 = int(input("请输入数字来决定怎样查询:\n"
"1.精确查询s_address\n"
"2.精确查询s_compary——name\n"
"3.模糊查询s_compary——name\n"
"4.生成动态二维码\n"
"5.更改查询\n"))
if Num1 == 1:
try:
# 精确查询--s_address
sql = '''select * from IT where s_addr=%s'''
address = input("请输入所要查询的地址信息:")
cursor = db.cursor()
cursor.execute(sql, address)
results = cursor.fetchall()
for row in results:
ID = row[0]
s_addr = row[1]
s_job_name = row[2]
s_job_salary = row[3]
s_compary_name = row[4]
print("%d,%s,%s,%s,%s" % \
(ID, s_addr, s_job_name, s_job_salary, s_compary_name))
db.commit()
except:
db.rollback()
cursor.close()
elif Num1 == 2:
try:
# 精确查询--s_compary_name
sql = '''select * from IT where s_compary_name=%s'''
comp_name = input("请输入所要查询的公司名称信息:")
cursor = db.cursor()
cursor.execute(sql, comp_name)
results = cursor.fetchall()
for row in results:
ID = row[0]
s_addr = row[1]
s_job_name = row[2]
s_job_salary = row[3]
s_compary_name = row[4]
print("%d,%s,%s,%s,%s" % \
(ID, s_addr, s_job_name, s_job_salary, s_compary_name))
db.commit()
except:
db.rollback()
cursor.close()
elif Num1 == 3:
try:
# 模糊查询--s_compary_name
sql_1 = '''SELECT * from IT where s_compary_name like '%'''
sql_2 = '''%' '''
comp_n = input("请输入所要查询的公司名称简略信息:")
sql = sql_1 + comp_n + sql_2
cursor = db.cursor()
cursor.execute(sql)
results = cursor.fetchall()
for row in results:
ID = row[0]
s_addr = row[1]
s_job_name = row[2]
s_job_salary = row[3]
s_compary_name = row[4]
print("%d,%s,%s,%s,%s" %(ID, s_addr, s_job_name, s_job_salary, s_compary_name))
db.commit()
except:
db.rollback()
cursor.close()
elif Num1 == 4:
#生成二维码在我的上一个博客中已经写了出来,不会的可以去看看
# [二维码的创建](https://blog.csdn.net/qq_41425751/article/details/105470233)
print("生成二维码")
myqr.run(
words='https://sjz.58.com/', # 链接
picture='mogu.gif', # 结合图片
save_name='58tongcheng.gif',
save_dir='image',
)
elif Num1 == 5 :
#这个是为了用到渲染库中的东西,就是为了让他自动输入,下面的其他地方就一样了
browser = webdriver.Chrome()
try:
browser.get('https://sjz.58.com')
input = browser.find_element_by_id('keyword')
input.send_keys('手机')
input.send_keys(Keys.ENTER)
wait = WebDriverWait(browser, 5)
wait.until(EC.presence_of_all_elements_located((By.ID, 'keyword1')))
data = str(browser.current_url)
print(data)
print(data[26:])
finally:
time.sleep(2)
flag = 1
for flag in range(1, 3):
url_1 = data[0:25]
url_2 = data[25:]
url_3 = '/pn' + str(flag) + ''
url = url_1 + url_3 + url_2
print(url)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/55.0.2883.87 Safari/537.36'}
Response = requests.get(url, headers=headers)
browser.get(url)
doc = pq(browser.page_source, parser='html')
phone_mess = doc('.t:first-child')
phone_addr = doc('.t .async-tags')
s_phone_mess = []
s_phone_addr = []
for x in phone_mess.items():
s_phone_mess.append(x.text())
for x in phone_addr.items():
s_phone_addr.append(x.text())
print(s_phone_mess)
print(s_phone_addr)
db = pymysql.connect("localhost", "root", "123456", "Test")
cursor = db.cursor()
if flag == 1:
# 建表--IT
try:
cursor.execute("DROP TABLE IF EXISTS phone")
sql = """CREATE TABLE phone (
ID int PRIMARY KEY AUTO_INCREMENT,
s_phone_mess VARCHAR(255),
s_phone_addr VARCHAR(255)
);"""
cursor.execute(sql)
cursor.close()
except:
db.rollback()
cursor.close()
# 插入数据--phone
for i in range(len(s_phone_mess)):
try:
sql = '''INSERT INTO phone VALUES(null,%s,%s)'''
cursor = db.cursor()
cursor.execute(sql, (s_phone_mess[i], s_phone_addr[i]))
db.commit()
except:
db.rollback()
cursor.close()
time.sleep(1)
browser.close()
else:
print("输入错误,退出中")
time.sleep(3)
break
driver.close()
可以通过Python的自定义函数来实现输入一个数字范围后,计算该数字范围内所有数字的总和或乘积的功能。下面是一个示例代码:
def calculate(start: int, end: int, operation: str) -> int:
if operation == 'sum':
return sum(range(start, end+1))
elif operation == 'product':
if 0 in range(start, end+1):
raise ValueError("Cannot calculate product with 0")
else:
res = 1
for i in range(start, end+1):
res *= i
return res
else:
raise ValueError("Invalid operation, choose either 'sum' or 'product'")
该函数有三个参数,分别是起始数字、终止数字和操作类型。操作类型有两个选项,分别是'sum'和'product',分别表示计算数字范围内所有数字的总和和乘积。
在计算乘积时需要考虑到0的情况,如果数字范围内有0,乘积就会等于0,因此需要抛出异常。
下面是对该函数的调用示例,求1~10的总和和乘积:
result_sum = calculate(1, 10, 'sum')
result_product = calculate(1, 10, 'product')
print("Sum of 1 to 10:", result_sum)
print("Product of 1 to 10:", result_product)
输出结果如下:
Sum of 1 to 10: 55
Product of 1 to 10: 3628800
在优化方面,可以将函数的输入参数改为一个范围对象,这样更直观一些。代码如下:
def calculate_range(range_obj: range, operation: str) -> int:
if operation == 'sum':
return sum(range_obj)
elif operation == 'product':
if 0 in range_obj:
raise ValueError("Cannot calculate product with 0")
else:
res = 1
for i in range_obj:
res *= i
return res
else:
raise ValueError("Invalid operation, choose either 'sum' or 'product'")
调用示例也相应更改为:
range_obj = range(1, 11)
result_sum = calculate_range(range_obj, 'sum')
result_product = calculate_range(range_obj, 'product')
print("Sum of 1 to 10:", result_sum)
print("Product of 1 to 10:", result_product)
输出结果与之前相同。