python 2x_python随笔(2)

python中 is 和 == 的区别

都用来判断两个变量是否相等,区别在:

is : 判断两个变量的引用是否相等。    值相等,引用不一定相同.

==: 判断两个变量的值是否相等。  如果引用相同,则值一定相等.

a = 1

b = 1

print(id(a)) # 1575434496

print(id(b)) # 1575434496

print(a is b) # True

print(a == b) # True

a = ‘hello world‘

b = ‘hello world‘

print(a is b) # True

print(a == b) # True

# 只有数值和字符串类型时,a is b 才是True

# 而对于列表(list)、元组(tuple)、字典(dict)、集合(set) a is b 为False

a = [1, 2, 3]

b = [1, 2, 3]

print(id(a)) # 55002536

print(id(b)) # 55003696

print(a is b) # False

print(a == b) # True

a = {‘name‘: ‘tom‘, ‘age‘: 19}

b = {‘name‘: ‘tom‘, ‘age‘: 19}

print(a is b) # False

print(a == b) # True

实际上在python中,

对于 -5 ~ 256 之间的整数(包含-5 和 256)都会初始化在内存中,所以当给变量赋值时,如果在这个区间中,他们都是指向同一个内存地址。

如果一旦超过这个范围,或者非整数,则会分配新的内存空间。则会返回False。

在PyCharm中,因为对解释器做了优化,所以测试的时候哪怕超过这个范围a is b 也是返回True。

所以我们只有在终端测试才能显示测试结果

##############################################终端测试##################################################

Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:06:47) [MSC v.1914 32 bit (Intel)] on win32

Type "help", "copyright", "credits" or "license" for more information.

>>> a = -5

>>> b = -5

>>> print(a is b)

True

>>> a = -6

>>> b = -6

>>> print(a is b)

False

>>> a = 256

>>> b = 256

>>> print(a is b)

True

>>> a = 266

>>> b = 266

>>> print(a is b)

False

>>> a = 6.666

>>> b = 6.666

>>> print(a is b)

False

Python解释器有一个intern(字符串驻留)的机制.

意思是同一个字符串只在常量池中保存一份,所以创建两个一样的字符串,他们都是指向了常量池中相同的地址。

但是要注意的是,当字符串中有空格时,则不会触发intern机制(在Pycharm中优化了解释器,仍然会触发).

>>> a = ‘helloworld‘

>>> b = ‘hello‘ + ‘world‘

>>> print(a is b)

True

>>> a = ‘hello world‘

>>> b = ‘hello world‘

>>> print(a is b)

False

任意数组,实现一个特定的排序

题目:

给定一个无序列表,要求按照奇数在前且正序排列,偶数在后,倒序排列。

如:[5, 1, 8, 9, 2, 3, 6, 5, 7]。

排序之后为:[1, 3, 5, 5, 7, 9, 8, 6, 2]

解一:第一种思路,可以将题目中的列表,按照奇数、偶数分为两个列表。分别对其就行正序和倒序排列。在将其进行组合。

# 初始列表

arr = [5, 1, 8, 9, 2, 3, 6, 5, 7]

# 定义一个偶数列表

a = []

# 定义一个奇数列表

b = []

for i in arr:

# 偶数放入a列表中

if i % 2 == 0:

a.append(i)

continue

# 奇数放入b列表中

b.append(i)

# 偶数列表倒序排列

a.sort(reverse=True)

# 奇数sort默认正序

b.sort()

b = b + a

# [1, 3, 5, 5, 7, 9, 8, 6, 2]

print(b)

解二:将列表先倒序排列,然后再遍历,当遇到奇数,将其从列表中取出并插入到第一位。

# 初始列表

arr = [5, 1, 8, 9, 2, 3, 6, 5, 7]

# 倒序排列

arr.sort(reverse=True) # [9, 8, 7, 6, 5, 5, 3, 2, 1]

for i in range(len(arr)):

if arr[i] % 2 != 0:

# 遇到偶数时,将其从列表中移除(pop),并将其放入第一位

arr.insert(0, arr.pop(i))

print(arr) # [1, 3, 5, 5, 7, 9, 8, 6, 2]

解三:利用sorted函数和lambda进行自定义排序。当为偶数时,返回比原始列表最大的数还要打的数即可。当为奇数是,返回本身

arr = [5, 1, 8, 9, 2, 3, 6, 5, 7]

# [1, 3, 5, 5, 7, 9, 8, 2, 6]

print(sorted(arr, key=lambda x: x % 2 == 0 and 20 - x or x))

用Python算出100万内的雷劈数

印度数学家卡普列加(Dattaraya Ramchandra Kaprekar, 1905 - 1986)在一次旅行中,遇到猛烈的暴风雨,他看到路边一块牌子被劈成了两半,一半上写着30,另一半写着25。这时,他忽然发现30+25=55,55^2=3025,把劈成两半的数加起来,再平方,正好是原来的数字。这种数字叫做雷劈数 或者 卡普利加数。(来自百度百科)

最小的雷劈数为81: 8+1=9   9² = 81

既然能一分为二说明这个数字的长度肯定是偶数,知道这一点就很方便的能算出100万以内的雷劈数了。

方式一:

for i in range(1000000):

i = str(i)

# 过滤数字长度不是偶数

if len(i) % 2 != 0:

continue

# a / b分别为两份数据

a = 0

b = 0

# 如果两位数直接截取

if len(i) == 2:

a = int(i[0])

b = int(i[1])

else:

# 分片截取

a = int(i[:int(len(i)/2)])

b = int(i[int(len(i)/2):])

# 得出结果

if (a + b) ** 2 == int(i):

print(i)

方式二:

for i in range(1000000):

a = len(str(i))

if a % 2 != 0:

continue

else:

# 通过求整 求余的方式进行截取

b = 10 ** (a // 2)

x = int(i / b)

y = i % b

if (x + y) ** 2 == i:

print(i)

用Python将字符串进行特殊的转换

任意给定一个字符串,要求:

将小写的字母转换成大写

将大写的字母转换成小写

将数字转换成9减去这个数的值

# 方法一

def transform(string):

new_str = ‘‘

for i in string:

if i.isdigit():

new_str += str(9 - int(i))

else:

new_str += i.swapcase()

return new_str

# 方法二

def transform2(string):

new_str = ‘‘

for i in string:

if i.isdigit():

new_str += str(9 - int(i))

elif i.isupper():

new_str += i.lower()

elif i.islower():

new_str += i.upper()

else:

new_str += i

return new_str

if __name__ == ‘__main__‘:

string = ‘[email protected]#1-1231;.,,^$d‘

print(transform(string)) # [email protected]#8-8768;.,,^$D

print(transform2(string)) # [email protected]#8-8768;.,,^$D

##########方法一可以写的更pythonic一点############

string = ‘[email protected]#1-1231;.,,^$d‘

result = ‘‘.join([str(9 - int(i)) if i.isdigit() else i.swapcase() for i in string])

print(result) # [email protected]#8-8768;.,,^$D

isdigit() : 用于检测字符串是否由纯数字组成,如果只要包含一个非数字就返回False。

a = ‘12315‘

print(a.isdigit()) # True

# 包含字符a

b = ‘12345a‘

print(b.isdigit()) # False

# 包含符号%

c = ‘123%15‘

print(c.isdigit()) # False

isalpha() : 检测字符串是否只有字母组成

a = ‘abcd‘

print(a.isalpha()) # True

b = ‘abcd123‘

print(b.isalpha()) # False

c = ‘abc$d‘

print(c.isalpha()) # False

swapcase() : 用于对字符串大小写字母的转换

a = ‘aBcD%Fe‘

print(a.swapcase()) # AbCd%fE

# 将字母全都转换成大写

print(a.upper()) # ABCDEFG

# 将字母全都转换成小写

print(a.lower()) # abcdefg

# 判断是否是大写 False

print(‘aaa‘.isupper())

# 判断是否是小写 # True

print(‘bbb‘.islower())

原文:https://www.cnblogs.com/jjb1997/p/11410049.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值