您的位置:首页 > 编程语言 > Python开发

基于python的一些算法实现

2018-03-31 11:52 405 查看

算法描述:生成四位随机的验证码,验证码的组成为大小写字母和数字。

思路:传说,此题有超过三十种方法解决,我现在来用其中一种,

        随机组成,肯定是要导入random,这毫无疑问,既然是随机,而且,数字和字母的ASCII码值连续,那就定义能获取三种字符的随机变量,然后每一位的验证码都在这三个里面选择,也就解决了。代码如下:

import random
def yzm():
#此处为random.randint(a,b),取a,b之间的随机整数
x1 = chr(random.randint(48,57))
x2 = chr(random.randint(66,90))
x3 = chr(random.randint(98,122))
#把上面的三个随机元素放在一个列表里,方便下面的random.choice()的调用
list_yzm = [x1,x2,x3]
print(random.choice(list_yzm),end='')
print(random.choice(list_yzm),end='')
print(random.choice(list_yzm),end='')
print(random.choice(list_yzm),end='')

return
#调用一次,就返回一个验证码,每次不同,所以就不添加结果了。。
yzm()
#------------------------------------------------------------------------------------

算法描述:封装一个可以统计字符串中英文字母和数字出现的次数的函数

思路:其实也是使用ASCII码值,今天看到关于ASCII的东西有点多,所以,不论解什么题都想先用和ASCII有关的方法。。

        好了,首先每个字母对应不同的ASCII码,每个数字也对应不同的ASCII码(废话),所以可以遍历字符串里面每个字符,然后判断其码值是介于数字之间,还是字母之间(要注意的是,字母因为区分大小写,有两段判断。)。代码如下:

def count_func(str1):#此处str就是形参,是要被传入函数并被操作的字符串
 #定义数字和字母的初始化值
sum_digit = 0
sum_letter = 0
    #开始遍历整个字符串,python里面的for循环很有趣,因为它是自增的,而Java和c中都要定义类似i++之类的语句来使循环继续执行
for i in str1:
        #判断当前字符的ASCII码值是否介于大小写的英文字母之间。【97,122】|【65,90】
if (ord(i) >= 97 and ord(i) <= 122) or (ord(i) >= 65 and ord(i) <= 90):
sum_letter += 1
        #判断当前的字符的ASCII码值是否介于数字之间,也就是大于等于48而小于等于57
elif ord(i) >= 48 and ord(i) <= 57:
sum_digit += 1
        #如果当前字符串不在数字和字母之间,那就跳出此次循环,使用continue语句。
else:
continue
print("英文字母个数:%d个" % (sum_letter))
print( "数字个数:%d个" % (sum_digit))
return sum_digit, sum_letter
str1 = 'akjfhuo23hr4jkn345jkb'
count_func(str1)
结果:
英文字母个数:15个
数字个数:6个
#--------------------------------------------------------------------------------
算法描述:使用python判断一个输入的列表是否为等差数列(默认输入的列表长度大于等于三,不要抬杠哦,尤其是不要和自己抬杠,两个元素的列表好像就是等差的吧。。我也不太明白)思路:首先,要知道列表的切片方法,还要知道列表取值是从下表为零的元素开始的。所以,在遍历时的限制是(0,len(str)-1)

代码如下:def is_arithmetic_progression(listl):     #获取列表的长度 list_len = len(listl)     #开始遍历列表,进行操作,但由于从零开始,所以当限定range的第二个元素时,     #由于等差数列的定义,第三个减去第二个,第二个减去第一个,一次就操作三个元素,所以i的最大值为【(len(list)-1)-3】 for i in range(0, list_len - 3):         #只要有一次不满足就返回False,跳出循环(return之后的语句不再执行) if listl[i+1] - listl[i] != listl[i+2] - listl[i+1]: return False return True m = [1,2,3,4,1,5] print(is_arithmetic_progression(m))[/code]

结果:False
#----------------------------------------------------------------------------

算法描述:计算字符串中所有数字的项的和(此处字符串中连续出现的数字视为一个数字,若是看做不同数字,可以用split()方法)

思路:使用正则表达式,找出所有数字(正则是贪婪的,连在一起的数字被视为一个数字被取出,若想要将每个数字字符都视为单独的数字,可以取消贪婪, 使用 .*?或者.+?)

代码如下

import re
def digit_sum_str(strl):
    #定义要查找的正则表达式,使用findall(),将找到的元素以列表的形式返回,但是要注意,返回的元素都是字符串。
listl = re.findall(r"\d+\.?\d*",strl)
    #初始化sum变量,
sum = 0
# print(listl)
    #开始遍历list1
for i in range(0,len(listl)-1):
        #每次都将list1[i]的值强转为int,并且加进sum
sum += int(listl[i])
return sum
str_1 = 'iaoej5io2n3rj43i5j'
print(digit_sum_str(str_1))
结果:53
#----------------------------------------------------------------------------

算法描述:对一个只含有小写字母和空格的字符串进行加密,a变为d,b变为f.....,空格不变。输出此字符串

思路:既然是加密,而且还是规律如此明显,一定要使用ASCII码值进行运算,这应该是毫无疑问的,我用的是比较笨的方法,先判断是不是想x,y,z,空格这四个,如果是的话,直接进行赋值,如果不是,就进行ASCII码值加1,再转为字符串(中间出了些小问题,就是对字符串的操作不太成功,所以把字符串转化为了列表,操作结束再转化为字符串,)

代码如下
def _encraption(strl):
    #因为对字符串的操作不成功,在这里将字符串转化为列表进行操作
strl = list(strl)
    #对列表进行遍历操作
for i in range(0,len(strl)-1):
        #下面的if和elif是对x,y,z,空格进行特殊赋值的操作
if strl[i] == 'x':
strl[i]='a'
elif strl[i] == 'y':
strl[i] == 'b'
elif strl[i] == 'z':
strl[i] == 'c'
elif strl[i] == ' ':
continue
        #如果不是上面的四种情况,那么进行ASCII码值的加3,并且再转化回来
else:
strl[i] = chr((ord(strl[i]))+3)
    #此处将列表再拼接为字符串
strl = ''.join(strl)
return strl

x = 'uashdnjn nlaksd'
print(_encraption(x))
结果:xdvkgqmq qodnvd
本题也可以采取取模的方法,不过也要判断空格,留待以后
#------------------------------------------------------------------------------- 阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: