python3常用技巧

整数的最大最小表示

import sys
max = sys.maxsize
min = -sys.maxsize -1

浮点数最大最小

float('inf')
float('-inf')

数组初始化

list1 = [n for n in range(1,6)] # 一维
list2 = [['a' for n in range(4)] for i in range(3)]# 二维3*4
list3 = ['b'] * 4 #一维1*4

数组复制

list1 = ['Google', 'Runoob', 'Taobao', 'Baidu']
list0 = list1[:]   # 方法0, 用切片,浅复制
list2 = list1.copy() ## 方法1
list3 = list(list1) ##方法2
list4=copy.copy(list1) ##方法3
list5=copy.deepcopy(list1) ##方法4, 深复制(唯一方法)

python的参数传递

  • 值传递还是引用传递
    Python参数传递统一使用的是引用传递方式。因为Python对象分为可变对象(list,dict,set等)和不可变对象(number,string,tuple等),当传递的参数是可变对象的引用时,因为可变对象的值可以修改,因此可以通过修改参数值而修改原对象,这类似于C语言中的引用传递;当传递的参数是不可变对象的引用时,虽然传递的是引用,参数变量和原变量都指向同一内存地址,但是不可变对象无法修改,所以参数的重新赋值不会影响原对象,这类似于C语言中的值传递。
    总结:可变对象是引用传递(class对象,list,dict,set等),不可变对象(number,string,tuple等)是值传递
  • 从编译原理本质来说,其实都是值传递。可变对象参数其实是引用

python处理输入

传送门

python处理输出

  1. 打印数组,去掉中括号
# 数组元素是str
print(' '.join(s))
# 数组元素不是str
print(' ',join(map(str, nums))
# 通过控制print不换行实现
for i in rang(len(s)):
    print(s[i], end=' ')

求和

ls = [1,2,3]
ans = sum(ls)

生成随机数

random.randrange(0, 10, 1) ##这三个参数类似range(0, 10, 1)
random.random() ##返回 [0.0, 1.0) 范围内的下一个随机浮点

python调试中的输入重定向

为了加快调试速度,避免每次运行都手动输入测试用例,应该将测试用例写在文件中,直接从文件中读取输入即可。下面介绍两种方式,假设测试用例在in.txt文件中

  • 用命令方式
python main.py < in.txt
  • 在pycharm中调试时,重定向输入
  1. 前提要求:
    pycharm版本>=2020.3
    pycharm版本>=2020.3
    pycharm版本>=2020.3
  2. 运行依次main.py文件,然后点击"edit configuration"
  3. 在弹出的配置界面勾选'Redirect input from', 然后选择输入的文件即可


    image.png

python判断字符串类型(数字、字母)

str_1 = "123"
str_2 = "Abc"
str_3 = "123Abc"
 
#用isdigit函数判断是否数字
print(str_1.isdigit())
Ture
 
#用isalpha判断是否字母
print(str_2.isalpha())
Ture    
 
#isalnum判断是否数字和字母的组合
print(str_1.isalnum())    
Ture
注意:如果字符串中含有除了字母或者数字之外的字符,比如空格,也会返回False

python整数除法的注意事项

除法有 “/” 以及 “//” 两种,前一种的结果如果除不尽则会以小数作为结果,后一种的结果是整除,结果一定是整数。但是这个整除是向下取整,而且有点诡异,与cpp有不同之处。具体为:在结果是正整数时,python与cpp一致,但是当结果是负数时,则python是真“向下取整”的,举例说明如下:

a = 1//-100   # a=-1 但是在cpp里面 a=1/-100结果等于0

要得到cpp的结果,即绝对值向下取整,用int()强转即可

a = 1//-100
a = int(a)   # a结果即为0

python取余的注意事项

余数的定义有两种,计算机领域的余数与数学上的余数其实是有差异的

  • 定义1:如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足a=qd+r且0 ≤ r < d(其中q为商,r为余数)。
    定义1一般作为数学中的取余法则,即两个数取余,余数总是为正数。
  • 定义2:如果a 与d 是整数,d 非零,那么余数 r 满足这样的关系:a = qd + r , q 为整数,且0 ≤ |r| < |d|。定义2取余的结果就会导致出现两个余数了,比如5%(-3) = (-3)x(-1)+2 = (-3)x(-2)-1,所以这里的余数2和-1都满足定义。
    我们把2称为正余数,-1成为负余数。通常,当除以d 时,如果正余数为r1,负余数为r2,那么有r1 = r2 + d。
  • 那么在计算机算余数的时候是如何取得呢? 实际上计算机取余的计算与整数除法直接相关,a%d余数计算公式为:

    c++语言中的a/d整数除法结果是尽量靠近0,而python中则是向下取整。所以python的负数取余结果也会很诡异。下面举例说明
# 在python中的结果如下
a = 1%-100 # a=-99, 因为1//-100 = -1, r=1-(-100)*(-1)=-99
b = -1%100 # a=99, 因为-1//100 = -1, r=-1-100*(-1) = 99
c = -1%-100 # a=-1, 因为-1//-100 = 0, r=-1-(-100)*0 = -1

但是在cpp中上述结果为:a=1, b=-1, c=-1. 因为商均为0。
总结:取余操作与整除的计算直接相关。因此python要实现与cpp类似的计算结果,应该从计算公式入手,把整数除法的结果计算正确,再套计算公式得出结果,即:

r = a - d*int(a/d)

python输出的格式控制

  1. 用%作为格式控制符(与C语言一致,做题常用)


    image.png
  2. 用format()函数
>>> 'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125)
'Hello, 小明, 成绩提升了 17.1%'
  1. 用f'xxx',替换{}中的变量
>>> r = 2.5
>>> s = 3.14 * r ** 2
>>> print(f'The area of a circle with radius {r} is {s:.2f}')
The area of a circle with radius 2.5 is 19.62

进制转换

  1. 读入指定进制的字符串
a = int('10101', base=2)
b = int('77', base=8)
c = int('FF', base=16)
# 当然 进制的字符串前面是有前缀的
# 2:0b
# 8:0o
# 16:0x
a = int('0b10101', base=2)
b = int('0o77', base=8)
c = int('0xFF', base=16)
  1. 将整数转换成指定进制的字符串
# octonary [ˈɑːktəˌneri]
# hexadecimal [ˌheksəˈdesɪml]
num = 15
a = bin(num)
b = oct(num)
c = hex(num)
# a b c 都是有前缀的,打印如下
>>> a
'0b1111'
>>> b
'0o17'
>>> c
'0xf'
>>>

单字符与编码转换

# char转编码的整数
a= 'A'
i = ord(a)
# 编码的整数转char
b = chr(i + 1)

排列组合

# -*- encoding=utf-8 -*-
from itertools import permutations
 
test_data = list('234')
 
""" 排列 """
for item in permutations(test_data, 2):
    print(item)
 
# 输出
"""
('2', '3')
('2', '4')
('3', '2')
('3', '4')
('4', '2')
('4', '3')
"""

# -*- encoding=utf-8 -*-
from itertools import combinations
 
test_data = list('1234')
 
""" 组合 """
for item in combinations(test_data, 3):
    print(item)
 
 
# 输出
"""
('1', '2', '3')
('1', '2', '4')
('1', '3', '4')
('2', '3', '4')
"""

维护有序列表

bisect模块实现了一个算法来向列表中插入元素,同时仍保持列表有序。

a = [1, 3, 3, 5]
x = 3
p = bisect.bisect_left(a, x, lo=0, hi=len(a)) # 找到保持列表有序的x的插入位置,当列表中有x元素时,则插入位置在x的最左侧。p=1
bisect.bisect_right(a, x, lo=0, hi=len(a)) # 找到保持列表有序的x的插入位置,当列表中有x元素时,则插入位置在x的最右侧。 p=3
# 当列表中没有x元素时,上述两个方法的返回值相同
# 上述两个方法只是返回插入的位置,下面的两个方法则是实际插入元素。时间复杂度为O(n),因为list插入操作的复杂度更大。
bisect.insort_left(a, x, lo=0, hi=len(a))
bisect.insort_right(a, x, lo=0, hi=len(a))

在python console中查使用文档

使用help()方法即可. 例如要查询list的使用方法,有哪些函数:

>>> help()

Welcome to Python 3.8's help utility!

If this is your first time using Python, you should definitely check out
the tutorial on the Internet at https://docs.python.org/3.8/tutorial/.

Enter the name of any module, keyword, or topic to get help on writing
Python programs and using Python modules.  To quit this help utility and
return to the interpreter, just type "quit".

To get a list of available modules, keywords, symbols, or topics, type
"modules", "keywords", "symbols", or "topics".  Each module also comes
with a one-line summary of what it does; to list the modules whose name
or summary contain a given string such as "spam", type "modules spam".

help>list
Help on class list in module builtins:

class list(object)
 |  list(iterable=(), /)
 |
 |  Built-in mutable sequence.
 |
 |  If no argument is given, the constructor creates a new empty list.
 |  The argument must be an iterable if specified.
 |
 |  Methods defined here:
 |
 |  __add__(self, value, /)
 |      Return self+value.
 |
 |  __contains__(self, key, /)
 |      Return key in self.
 |
 |  __delitem__(self, key, /)
 |      Delete self[key].
 |
 |  __eq__(self, value, /)
 |      Return self==value.
 |
 |  __ge__(self, value, /)
 |      Return self>=value.
 |
 |  __getattribute__(self, name, /)
 |      Return getattr(self, name).
 |
 |  __getitem__(...)
 |      x.__getitem__(y) <==> x[y]
 |
 |  __gt__(self, value, /)
 |      Return self>value.
 |
 |  __iadd__(self, value, /)
 |      Implement self+=value.
 |
 |  __imul__(self, value, /)
 |      Implement self*=value.
 |
 |  __init__(self, /, *args, **kwargs)
:

你可能感兴趣的:(python3常用技巧)