codewars 刷题笔记(杂知识)

以下是自己犯的小错误:

0.一个数的平方是 x**2 或者 x*x,但千万别写成 x**x

1.如果 case-insensitive ,也就是说不区分大小写,都变成小写就好了.

char = char.lower()

2.计算一个字符串中有多少个 x ,可以这么写

char.count('x')

3. join() 作为拼接字符串的方法,所接受的参数必须是字符串.不能是整形

4.range 函数返回一个迭代器,它产生一个均匀分布的整数序列.

range 的三个参数是(起点,终点,步长)

 


In [124]: list(range(0, 20, 2))
Out[124]: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

In [125]: list(range(5, 0, -1))
Out[125]: [5, 4, 3, 2, 1]

range 和切片一样, 不包括终点.

range 函数可以从负数开始遍历.

5.sum() 的参数只有一个.

6.对于字符串切片,其实也是理所应当的.

s = 'help'
s[0:0]
''
s[3:]
'p'

7.判断一个变量是不是数字isinstance可以用类型元组,检查对象的类型是否在元组中

isinstance(1,(int,long,float))
True
isinstance('a',(int,long,float))
False

8.判断一个字符串的内容是否表示数字

foo = '123.456'
# replace 的第三个参数是可选参数,表示最多替换的次数
foo.replace('.','',1).isdigit()
True

9.python被认为是强类型化语言,也就是说 python  不会自动转换数据类型

5 + '5'

在某些语言中,例如Visual Basic,字符串‘5’可能被默许转换(或投射)为整数,因此会产生10。但在其它语言中,例如JavaScript,整数5 会被投射成字符串,结果是联结字符串 ‘55’ 。


意味着每个对象都有明确的类型,默认转换只会发生在特定的情况下.

In [16]: '5' + 5---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
 in ()
----> 1 '5' + 5
TypeError: must be str, not int

 

In [17]: a = 4.5
In [18]: b = 2
# String formatting, to be visited later
In [19]: print('a is {0}, b is {1}'.format(type(a), type(b)))
a is , b is 
In [20]: a / bOut[20]: 2.25

 

10.鸭子类型

经常的,你可能并不关心对象的类型,只关心对象是否有某些方法或者用途.这通常被称为'鸭子类型':走起来像鸭子,叫起来像鸭子,那么它就是鸭子.

例如,你可以通过验证一个对象是否遵循迭代协议,判断它是可迭代的。对于许多对象,这意味着它有一个 __iter__ 魔术方法,其它更好的判断方法是使用 iter 函数。


def isiterable(obj):
    try:
        iter(obj)
        return True
    except TypeError: # not iterable
        return False

这个函数会返回字符串以及大多数Python集合类型为True。


In [29]: isiterable('a string')
Out[29]: True

In [30]: isiterable([1, 2, 3])
Out[30]: True

In [31]: isiterable(5)
Out[31]: False

 

用这个功能编写可以接受多种输入类型的函数。

常见的例子是编写一个函数可以接受任意类型的序列(list、tuple、ndarray)或是迭代器。你可先检验对象是否是列表(或是NUmPy数组),如果不是的话,将其转变成列表


if not isinstance(x, list) and isiterable(x):
    x = list(x)

 

11.引入

在Python中,模块就是一个有 .py 扩展名、包含Python代码的文件。假设有以下模块:


# some_module.py
PI = 3.14159

def f(x):
    return x + 2

def g(a, b):
    return a + b

如果想从同目录下的另一个文件访问 some_module.py中定义的变量和函数,可以:有点像类的属性和方法


import some_module
result = some_module.f(5)
pi = some_module.PI

或者:


from some_module import f, g, PI
result = g(5, PI)

使用as关键词,你可以给引入起不同的变量名:


import some_module as sm
from some_module import PI as pi, g as gf

r1 = sm.f(pi)
r2 = gf(6, pi)

12.要判断两个引用是否指向同一个对象,可以使用 is 方法(不难想象, is not 是什么作用.)


In [35]: a = [1, 2, 3]

In [36]: b = a

In [37]: c = list(a)

In [38]: a is b
Out[38]: True

In [39]: a is not c
Out[39]: True

ps : list 总是创建一个新的python列表!

13. is 比较  和 == 运算符不同

 


In [40]: a == c
Out[40]: True

is 比较的是对象的引用,而 == 比较的是对象的值

codewars 刷题笔记(杂知识)_第1张图片

 

14.可变与不可变对象

可变 : 列表,字典,numpy数组,用户自定义的类型

不可变: 字符串,元组

15.字符串.对于有换行符的字符串,可以使用三引号,'''或"""都行

 


c = """
This is a longer string that
spans multiple lines
"""

In [55]: c.count('\n')
Out[55]: 3

16.如果字符串中包含许多反斜杠,但没有特殊字符,这样做就很麻烦。幸好,可以在字符串前面加一个r,表明字符就是它自身. r 表示 raw


In [69]: s = r'this\has\no\special\characters'

In [70]: s
Out[70]: 'this\\has\\no\\special\\characters'

17.类型转换

str、bool、int 和 float 也是函数,可以用来转换类型

 

18.None

None是Python的空值类型。如果一个函数没有明确的返回值,就会默认返回None

 

19.三元表达式

下面两个语句是相同的效果!


value = true-expr if condition else false-expr


if condition:
    value = true-expr
else:
    value = false-expr

虽然使用三元表达式可以压缩代码,但是会降低代码的可读性。

 

20.控制流

(1) 在 python 中,不管是 if,还是 while,for 都有 else 语句。都是前面的 if while for 正常运行之后,才会运行else后面的语句

(2) 用break跳出循环,但是 break 语句只会跳出最内层的循环

(3) pass 是Python 中的非操作语句



如何判断一个字符串中大写字母还是小写字母多呢 ? 

def solve(s):
    return s.lower() if sum(1 for i in s if i in "abcdefghijklmnopqrstuvwxyz") *2 >=len(s) else s.lower()
def solve(s):
    return s.upper() if sum(map(str.isupper,s)) * 2 > len(s) else s.lower()

 



如何在一个字符串中找到特定的单词(或者出现符合预期的单词的个数)

import re
def sum_of_beach(string):
    return len(re.findall('Sand|Water|Fish|Sun',string,re.IGNORECASE))

note : findall () 返回的是一个列表 !



将罗马数字转换成十进制数字

Symbol    Value
I          1
V          5
X          10
L          50
C          100
D          500
M          1,000
In [7]: def solution(roman):
   ...:   """complete the solution by transforming the roman numeral into an int
   ...: eger
            我的思路 : 罗马数字 左减右加 .依次判断右边的罗马数字是不是比左边的大,
            若左<右.说明这两个数字是一个组合,左边取负值,右边取正值 !!
          """
   ...:   roman_numeral = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
   ...:   sum = 0
   ...:   for i,s in enumerate(roman):
   ...:       if i == len(roman)-1:
   ...:           sum = sum + roman_numeral[s]
   ...:           return sum
   ...:       if roman_numeral[s] >= roman_numeral[roman[i+1]]:
   ...:           sum = sum + roman_numeral[s]
   ...:       else :
   ...:           sum = sum - roman_numeral[s]
   ...:       return sum

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(python)