raw_input(), input(), strip() 和 split() 讲解
HackerRank Find a string 笔记和题解,raw_input() 和 input() 的区别在哪里?Python string strip() 和 split() 该怎么用?
Table of Contents
简介
这篇笔记是在我做到 Find a string (HackerRank) 这题是写下的,也算稍微解释下一些常用的概念吧。
raw_input() 和 input()的区别
raw_input() 其实是 Python2 才有的,功能和现在 Python3 的 input() 是一样的。
而原本 Python2 也有一个叫 input() 的 function,它的功能相当于 Python3 里面的 eval(input()),具体关系如下:
Python2 | Python3 |
---|---|
input() = eval(raw_input()) | eval(input()) |
raw_input() | input() |
Python2 到 Python3 的改变
- 原 input() 删除
- raw_input() 改名为 input()
- 原 input() 的功能等同于 Python3 中的 eval(input())
eval() 的危险之处
Python3 里面的 eval(input()),也就是原 Python2 的 input(),会将用户的输入当成是 python expression 来处理,但这样的处理有时候是很危险的:
result = 10
guess = eval(input())
if guess == result:
print("You are right!")
else:
print("Sorry, it is wrong.")
比如这段代码,我们用 result 设置了一个数字10,然后让用户通过输入来猜数字。比如我们输入8和10就对应了不同的结果:
8
Sorry, it is wrong.
10
You are right!
但最好玩的在于,如果我们输入的是 result 这个词:
result
You are right!
它居然是对的!因为 eval 会把输入当作 python expression 来处理,所以在检查条件是相当于直接调用了 result 这个值进行比对。
同样的道理,我们也可以对 list 里面的值进行改动。
def append_2(l):
l.append(2)
result = [1,3,5]
guess = eval(input())
print(result)
输入:
append_2(result)
输出:
[1, 3, 5, 2]
可以看到这里我们通过 eval(input()) 往 result 这个 list 里添加了一个2。所以 eval() 这个 function 要慎用,要确保不会产生安全问题。
strip() 和 split()
strip()
语法
str.strip([chars])
用法
strip() 是 string 的一个 method,用来移除一个 string 头尾的指定 character,默认是空格。
s = " hey "
d = " hey d "
print(s.strip())
print(d.strip())
输出:
hey
hey d
可以看到它是从两边开始检测,然后遇到第一个非空格的字符就停止。
e = "banana ghost nanaba"
print(e.strip("ban "))
输出:
ghost
这里我们在 argument 里面传入 b,a,n,还有“空格”四个字符,strip就会从左右两边检测,检测第一个不属于这四个的字符就停止。
split()
语法
str.split(sep=None, maxsplit=- 1)
用法
split 是用来将一个 string 给拆分成一个 list 的,不过很多初学者可能不知道 split 是可以输入两个 arguments 的。
首先基本的用法,默认是按照空格区分:
l = "Amy Sheldon Penny"
x = l.split()
print(x)
输出:
['Amy', 'Sheldon', 'Penny']
也可以指定字符:
l = "Amy-Sheldon-Penny-Leonard"
x = l.split("-")
print(x)
输出:
['Amy', 'Sheldon', 'Penny', 'Leonard']
也可以输入第二个 maxsplit 的 argument,可以决定要 split 多少次:
l = "Amy-Sheldon-Penny-Leonard"
x = l.split("-",2)
print(x)
输出:
['Amy', 'Sheldon', 'Penny-Leonard']
比如这里就只根据前两个 "-" 来处理这个 string,最终将其分成3份。
题解
写这题的时候,我一开始忘了 string 可以直接 indexing,还想着给它转成 list。
def count_substring(string, sub_string):
result = 0
sub_len = len(sub_string)
for i in range(len(string) - sub_len + 1):
if sub_string == string[i:i+sub_len]:
result += 1
return result
希望这篇文章能对你有所帮助!
然的博客 Newsletter
Join the newsletter to receive the latest updates in your inbox.