分享

菜鸟python100例

 流形sbz 2023-11-11 发布于甘肃

例1:题目:有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?

方法1:三层for

for i in range(1,5):
    for j in range(1,5):
        for k in range(1,5):
            if i!=j and i!=k and j!=k:
                print(i,j,k)
1 2 3
1 2 4
1 3 2
1 3 4
1 4 2
1 4 3
.......(略)

以下集合网友的方法,学习下
方法2:

from itertools import permutations
for i in permutations([1, 2, 3, 4], 3):
    print(i)
(1, 2, 3)
(1, 2, 4)
(1, 3, 2)
(1, 3, 4)
(1, 4, 2)
......()

简单整理了permutations函数和combinations函数
permutations函数重在排列
combinations函数重在组合(均是不重复)
python 3.x 中函数返回的是iterators,无法像python2.x 直接返回一个list,故需要再加上一个list()将iterators转化为一个list),像这类函数还有map()

import itertools
s=[1,2,3]
list1=list(itertools.combinations(s,3))
print(list1)
list2=list(itertools.permutations(s,3))
print(list2)

结果

[(1, 2, 3)]
[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]

方法3

for i in range(123,433):
    a = i //100        # 求百位
    b = i //10 % 10    # 求百位
    c = i % 10         # 求个位
    if a != b and a != c and b != c and 0 <a<5 and 0 <b<5 and 0 <b<5:
        print(i)
123
124
125
126
....()

例2跳过

例3:题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

解析:
a 100=i^2 (i和j可以为负数,为负数时,a为同一个)
a 168=j^2
168=(j i)*(j-i)
根据上面等式找i,j范围,范围尽可能缩小

方法1:双层for 逆向

# i,j的范围可以为负数,-85<i<85,i/j为负数或正数,对应的a为同一个,所以只取i/j正数范围
for i in range(1, 85):
    for j in range(1, 85):
        if (j i)*(j-i) == 168:
            print(i*i-100)

结果

-99
21
261
1581

方法2: 集合

#X1=N*2-100的合集
x1 = map(lambda i:i**2-100,range(1,85))
#X2=M*2-100-168的合集
x2 = map(lambda i:i**2-100-168,range(1,85))
#两个合集求并集结果
print(set(list(x1)) & set(list(x2)))

结果

{21, 1581, 261, -99}

例4:题目:输入某年某月某日,判断这一天是这一年的第几天?

在这里插入图片描述
方法1:

year = int(input('输入年份:'))
month = int(input('输入月份:'))
day = int(input('输入日期:'))

# 闰年的月份
runmonths = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
# 平年的月份(差别在第二个月份)
pingmonths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
runday = sum(runmonths[0:month-1]) day
pingday = sum(pingmonths[0:month-1]) day
if ((year % 4 == 0 and year % 100 != 0) or (year % 400 == 0 and year % 4000 != 0)):
        print('这是该年的第%d天' % runday)
else:
        print('这是该年的第%d天' % pingday)

结果

输入年份:2019
输入月份:12
输入日期:3
这是该年的第337

判断闰年还可以导入calendar,并替换if 内的条件语句

import calendar
flag = calendar.isleap(year)  # 判断输入的年份是否为闰年
if flag == 1:
.......(下同,略)

方法2: python 自带的日期
python中时间日期格式化符号:
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%j 年内的一天(001-366)

import time
# 格式化时间
print(time.strptime('2019-12-03', '%Y-%m-%d')[7])

结果

337

方法2扩展

time.localtime()
time.struct_time(tm_year=2015, tm_mon=10, tm_mday=30, tm_hour=16, tm_min=25, tm_sec=45, tm_wday=4, tm_yday=303, tm_isdst=0)
time.localtime().tm_year
2015

import time

yourtime=input('请输入年份,格式如XXXX-XX-XX:')
# 将时间格式化
d=time.strptime( yourtime,'%Y-%m-%d').tm_yday
print 'the {} day of this year!' .format(d)

例5:题目:输入三个整数x,y,z,请把这三个数由小到大输出。

方法1:sort() / sorted()
注意写法

array.sort(reverse = False) # 默认升序False,可不填写 print(array) # 原数组array本身已改变

newarray = sorted(array,reverse = False) # 默认降序
print(newarray) #变换结果
print(array) #原数组array没有改变

c =['CCC’, 'kb’, 'ffff’, 'bz’] # 输入关键字len进行字符串排序
result = sorted(c,key=len)

numbers = [5,9,1]
numbers.sort(reverse=False)
print(numbers)
[1, 5, 9]

方法2:排序算法

例6:题目:斐波那契数列。输出第n个斐波那契数列。(适用于走楼梯的例子)

序号 1 2 3 4 5 6 7 8
数列 1 1 2 3 5 8 13 21

方法1:递归调用

def Fibonacci(n):
    if n <= 0:
        return None
    if n == 1 or n == 2: 
        return 1        # 函数的出口
    else:
        return Fibonacci(n-1)   Fibonacci(n-2)
result = Fibonacci(8)
print(result)

结果

21

方法2:
在C语言中,下标循环,将每一个当作数组元素
f[i] = f[i-1] f[i-2]
f[i] = f[i-1]
f[i-1] = f[i-2]
但在该例子中,用以下方式来替换,思路相同

num = int(input('请输入序号'))
if num <= 0:
    print('none')
else:
    a, b= 1, 1   # 元组类型
    for i in range(1,num):
        a,b = b,a b   # 交换
    print(a)

方法3:(好秒的方法)

def Fibonacci(n):
    if n <= 0:
        return None
    elif n == 1 or n==2:
        return 1
    else:
        array = [1, 1]
        for i in range(2, n):
            array.append(array[-1] array[-2])
        return array[n-1]
print(Fibonacci(10))

例7:题目:将一个列表的数据复制到另一个列表中。

方法1:append
对空数组进行尾部追加

a = [1, 2, 3, 4]
b1 = []
length = len(a)
for i in range(length):
    b1.append(a[i])
print(b1)

方法2:列表[:]
新数组的改变不会影响到原数组

a = [1, 2, 3, 4]
b5 = a[:]
print(b5)
b5.pop()
print(b5)
print(a)     # a没有发生改变

结果

[1, 2, 3, 4]
[1, 2, 3]
[1, 2, 3, 4]

方法3:引用(虽然结果一样,不推荐)
新数组的改变会影响到原数组

a = [1, 2, 3, 4]
b2 = a
b2.pop()
print(b2)
print(a)    # 引用,新数组变化,原数组也会变化。

结果

[1, 2, 3]
[1, 2, 3]

方法4:copy

a = [1, 2, 3, 4]
b4 = a.copy()
print(b4)

例8:九九乘法表

for i in range(1, 10):
    for j in range(1, i 1):
        print('%dx%d=%d' % (j, i, j*i), end=' ')
        # 格式化
#        print('{}*{}={}'.format(j, i, j * i))
    print(' ')

例9:暂停一秒输出

注意输出字典的方式 键值对输出

import time
 
myD = {1: 'a', 2: 'b'}
for key, value in dict.items(myD):
    print key, value
    time.sleep(1) # 暂停 1 秒

结果

1 a
2 b

例10:题目:暂停一秒输出。

import time
print(time.strftime('%Y-%m-%d %H-%M-%S', time.localtime(time.time())))
time.sleep(1)
print(time.strftime('%Y-%m-%d %H-%M-%S', time.localtime(time.time())))

or

import time,datetime
time.sleep(1)
TIME = datetime.datetime.now() #获取当前时间
print(TIME.strftime('%Y.%m.%d %H-%M-%S'))

例11:题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

斐波那契数列规律,略

例12:题目:判断101-200之间有多少个素数,并输出所有素数。

方法1:常规 判断条件:if i % j == 0:

class Solution(object):
    def Sushu(self):
        jishu = 0
        for i in range(101, 201):
            for j in range(2, i//2):  # i//2还可以缩小到i**0.5
                if i % j == 0:
                    break
                # if i-1 == j:
                #     jishu  = 1
                #     print(i)
            else:
                jishu  = 1
                print(i)
        return jishu

s = Solution()
result = s.Sushu()
print(result)

结果

101 103 107 109 113 127 131 137 139 149 151 
157 163 167 173 179 181 191 193 197 199 
21

方法2:判断条件:if i % j == 0:
换一种形式,列表

class Solution(object):
    def Sushu(self):
        mylist = []
        for i in range(101, 201):
            mylist.append(i)   #加入元素
            for j in range(2, int(sqrt(i)) 1):
                if i % j == 0:
                    mylist.pop()  # 剔除不符合条件的元素
                    break
        return mylist, len(mylist)

结果

([101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199], 21)

例13 水仙花数

求余 求整 分别求出个位/十位/百位

例14 题目:将一个正整数分解质因数。例如:输入90,打印出90=2x3x3x5(间隔符为*)

class Solution:
    # 返回[a,b] 其中ab是出现一次的两个数字
    def Fenjie(self, num):
        # write code here
        k = 2
        array = []
        res = num
        while k >= 2 and k < num:
            if res % k == 0:    # 找出所有连乘的质数,包括重复的
                res = res // k
                k = k       # 考虑到可能下一个还是重复的因子
                array.append(str(k))   # 转换成str,为了下面的join方便
            else:
                k  = 1
        return '%d=' %num   '*'.join(array)  # 输出格式

num = int(input('请输入一个正整数'))
s = Solution()
s.Fenjie(num)
print(s.Fenjie(num))

例15 题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

方法1:if else(三目)
语法:条件为真时的结果 if 判段的条件 else 条件为假时的结果

score = int(input('输入成绩'))
print('A' if score >= 90 else ('B' if score >= 60 and score < 90 else ' C'))

方法2:and-or连用(相当于三目),完美用一句话替代第三种方法,
格式:xxx and xxx or xxx and xxx or xxx

# 以下两句任意一句都可以
print(score >= 90 and 'A' or (score < 90 and score >= 60) and 'B' or 'C')
print('A' and score > 89 or 'B' and score >= 60 or 'C')

方法3: if -elif-else

score = int(input('输入成绩'))
s = score // 10
if s >= 9:
    print('A')
elif 6 <= s and s <= 8:
    print('B')
else:
    print('C')

例16 题目:输出指定格式的日期

抄了网友的

import time

print time.time()  #1498539133.655
print time.localtime()  #tm_year=2017, tm_mon=6, tm_mday=27, tm_hour=12, tm_min=53, tm_sec=16, tm_wday=1, tm_yday=178, tm_isdst=0
print time.asctime()  #'Tue Jun 27 12:53:50 2017'
print time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()) #'2017-06-27 13:00:57'

import datetime

print datetime.date.today() #datetime.date(2017, 6, 27)
print datetime.date.today().strftime('%d/%m/%Y') #'27/06/2017'
print datetime.date(1941, 1, 5) #datetime.date(1941, 1, 5)

例17 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

中文?暂留疑问
方法1:也适用于c语言

str = input('请输入字符')
length = len(str)  #中文占空不是一个字符,len()无法统计
a, b, c, d, e= 0, 0, 0, 0, 0
for i in range(length):

    if str[i] <= 'z' and str[i] >= 'a':
        a  = 1
    elif str[i] <= 'Z' and str[i] >= 'A':
        b  = 1
    elif str[i] == ' ':
        c  = 1
    elif str[i] <= '9' and str[i] >= '0':
        d  = 1
    else:
        e  = 1
print('英文小写:%d, 英文大写:%d, 空格:%d, 数字:%d, 其他字符:%d' % (a, b, c, d, e))

方法2:python 自带的函数

str = input('请输入一个字符串:\n')
for c in str:
    if c.isalpha():    #英文
        letters  = 1
    elif c.isspace():  # 空格
        space  = 1
    elif c.isdigit():  # 数字   
    # c.isnumeric():
        digit  = 1
    else:              # 其他
        others  = 1

方法3:自带函数

import re
str = input('请输入一个字符串:\n')
for i in range(len(str)):
        if re.match('\d',str[i]):     #数字
            digNum  =1
        elif re.match('[a-zA-Z]',str[i]):   #大小写英文字母
            charNum  =1
        elif re.match('\s',str[i]):  #空格
            spaceNum  =1
        else:
            otherNum  =1

例18:题目:求s=a aa aaa aaaa aa…a的值,其中a是一个数字。例如2 22 222 2222 22222(此时共有5个数相加),几个数相加由键盘控制。

关键:如何表示每一个数字

方法1: 将数字转换成字符串

count = input('请输入个数count')
num = input('请输入数字num')
sum = 0
for i in range(1, int(count) 1):
    everynum = int(num*i)
    sum  = everynum

方法2:找数字规律,边找边加
aaa = a x 100 a x 10 a

count = int(input('请输入个数count'))
num = int(input('请输入数字num'))
sum = 0
everynum = 0
if count <= 0:
    print(0)
else:
    for i in range(1,count 1):
        everynum  = num * 10 **(i-1)
        sum  = everynum
print(sum)

方法3: 同2,也是找每个数规律(将每个数集合到一个列表,最后将列表元素加起来)

Tn = 0
Sn = []
n = int(raw_input('n = '))
a = int(raw_input('a = '))
for count in range(n):
    Tn = Tn   a
    a = a * 10
    Sn.append(Tn)
    print Tn
 # 对列表元素的累加
Sn = reduce(lambda x,y : x   y,Sn)
print '计算和为:',Sn

例19:目:一个数如果恰好等于它的因子之和,这个数就称为'完数'。例如6=1+2+3.编程找出1000以内的所有完数

import functools import reduce
from sys import stdout
def yinzi(num):
    array = []
    i = 1
    while 0 < i < num:
        if num % i == 0:
            array.append(i)
        i  = 1
    return array
for i in range(1, 1001):
    array = yinzi(i)
    # print(array)       # 能打印出来,如果不是空列表,代表该数不是素数
    if array:            # 排除空列表,即没有因子的i,因为该数一定为素数,素数的因子相加绝对不会等于该数本身
        sum = reduce(lambda x, y: x y, array)
        # yinzisum = sum(array)    #列表求和的两种方式
        if i == sum :
            # print(array, i)
            # stdout.write和print差别:前一个实时打印,根本在于一个结束符为\n,自动换行,一个结束符号\r,不会自动换行
            stdout.write(str(i))
            stdout.write(str(array))
            stdout.write(' ')

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多