方法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跳过
解析:
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}
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)
方法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:排序算法
略
方法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))
方法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)
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(' ')
注意输出字典的方式 键值对输出
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
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'))
斐波那契数列规律,略
方法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)
求余 求整 分别求出个位/十位/百位
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))
方法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')
抄了网友的
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)
中文?暂留疑问
方法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
方法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
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(' ')
联系客服