这篇文章面向刚学完 Python 语法、想靠“自己动手”加强逻辑思维的同学。五个函数看似简单,却涵盖了循环、条件、切片、列表 / 字符串转换、内置方法取舍等实战细节。文章先给出改进后的代码,再逐段拆解思路与常见坑。
首先呢,这下方是本篇文章所用到的测试数据。很简单,但是运用起来可不简单噢!一起来看看吧!
# 统一用到的测试数据
l_nums = [22, 12, 32, 33, 67, -21, 98, 76, 54, 20, 87, 68, 55]
demo_str = "hello"
join_input = ['22点','记得','回家','我给你开门!']
nums_repeat = [1, 2, 3, 2, 4, 1, 5]
1. max_num
——不用 max()
找最大值
在我们进行数据统计时,经常会说这组数据中最大值是多少,那我们通常就会使用max(),其实max()函数,内置函数确实一行搞定,但练习“循环+判断”是在培养算法思维。
l=[22,12,32,33,67,-21,98,76,54,20,87,68,55]
def max_num(l):
max_value_list=list(l) #将字符串转换为列表之后处理
max_value = l[0] #假设最大的是列表的第一个
for i in max_value_list: #i在列表中
if i> max_value:
max_value=i #要是i>max_value(我们假设的最大值),那就令max_value=i
return max_value
print(max_num(l)) # 运行之后的结果为:98
思路要点
-
先假设:把首元素当作当前最大;
-
逐个对比:只要出现更大的就更新;
2. reversed_str
——从右往左手写字符串反转
虽然我们通常可以使用reversed()函数,但理解索引逆序更扎实!在这个函数里面我们练习了len()求得字符串的长度、for循环、空字符串的巧妙使用。
def reversed_str(old_string):
t=len(old_string)
new_string=""
for i in range(t-1,-1,-1): #range(起始值,终止值,步长)
u=old_string[i] #将旧字符串的每个元素依次遍历
new_string += u #同时组合成新的字符串new_string
print(new_string)
reversed_str("hello") #运行之后的结果为olleh
提示:
-
range(start, stop, step)
第三个参数传-1
就能倒序遍历索引; -
字符串是不可变类型,只能通过重新拼接生成新串;
3. word_joined
——自写 join
把列表拼成字符串
原有的join函数的写法是“分割符号”.join(),那我们来尝试一下自己写一个函数实现将列表中的元素拼成一个字符串,在这里我们使用了字符串与列表的转换、for循环以及空字符串。
def word_joined(past_sentence):
Y=list(past_sentence) #将past_sentence转变为列表进行后续操作
result='' #下面要使用for循环依次将元素提出,组成最后结果。
for i in range(len(Y)):
result += str(Y[i]) #将每次提出的元素组合
return result #返回结果
print(word_joined(['22点','记得','回家','我给你开门!']))
核心思路
-
和内置
"".join()
本质一致,但多了显式类型转换str(item)
; -
如果元素本身可能是整型 / 浮点型,这个显式转换能防止报错;
4. distinct_word
——顺序去重
我们都知道在set()函数可以直接将字符串转化为无重复(去重)的列表,但是我们应该注意到使用set()函数之后得到的列表是打乱了原顺序的。因此我们来写一个不会被打乱次序,也能够达到去重效果的函数。
def distinct_word(old_sentence):
Z=len(old_sentence) #取得原句的字符长度
old_list=list(old_sentence) #将原字符串变成列表
new_sentence=[]
for i in range(Z): #i在old_sentence的字符长度中遍历
if old_list[i] not in new_sentence: #判断第i个old_list中的元素是否在new_sentence
new_sentence.append(old_list[i]) #没有的话,就将这个元素加入new_sentence中
return new_sentence
distinct_word("你你吃夜宵宵了没啊啊!")
#结果为“你吃夜宵了没啊”
5. sec_large
——找第二大(与上面的去重函数结合)
在先前我们已经写出求得最大值的函数咯,那求得第二大的元素的方式是否一致?我们一起来试试。在这里我们会使用一个我们所设定的distinct_word()去重函数、以及python内置的sort()排序函数、和if循环结构。
nums = [1, 2, 3, 2, 4, 1, 5]
def sec_large(old_sentence):
Q = distinct_word(old_sentence) #运用上面distinct_word去重函数,减少重复带来的错误
Q.sort(reverse=True) #对列表进行排序,true是进行降序排序
if len(Q) <2: #判断Q列表的长度,如长度小于2,就没有第二大的元素
return None
return Q[1] #返回索引为1的元素,即第二大的元素
print(sec_large(nums))
小结 & 延伸
-
算法练习 ≠ 和库函数对抗,而是借此培养“先思考再敲代码”的习惯;
-
当你了解了底层实现,再去使用
max()
、[::-1]
、"".join()
时,你才真正掌握了它们的本质与局限。
祝你编码愉快,如果有任何疑问或想挑战更高难度,欢迎留言讨论!