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

希望这篇文章能对你有所帮助!

HackerRankPython简单难度

Comments