Python 常用技巧

Python 隐秘的角落

1. *args 和 **kwargs 的使用

# 此处一定要注意 python 中有默认值得参数一定一定要放在没有默认值的后边。
# *args 是以元组类型传入
# **kwargs 是字典类型传入
def parameter_learn(parameter_1, parameter_2=None, *args, **kwargs):
     """ *args, **kwargs 参数传递的使用
    :param parameter_1: 此处的 parameter_1 一定要在 parameter_2 前面
    :param parameter_2: 
    :param args: 当出现默认赋值时(ps:parameter_2=None) args 可能无法生效。
    :param kwargs: 无顺序新增加参数时将新参数直接传入即可( ps:kwarg_1=1 ) ; 参数将以字典的形式传入
    :return: 
    """
    print(parameter_1, parameter_2)
    print(args)
    print(kwargs)


parameter_learn(parameter_1=1, parameter_2=2, kwarg_1=1)
"""result: 
1 2 
()
{'kwarg_1': 1}
"""


# 按位置传参
def parameter_learn2(parameter_1, parameter_2, *args, **kwargs):
     """
    :param parameter_1:  第一个位置参数
    :param parameter_2:  第二个位置参数
    :param args: 		第二个后面的位置参数
    :param kwargs: 		字典传入的参数
    :return: 
    """
    print(parameter_1, parameter_2)
    print(args)
    print(kwargs)


parameter_learn2(1, 2, 3, 4, 5, kwarg_1=1, kwarg_2=2)


"""result:
1 2
(3, 4, 5)
{'kwarg_1': 1, 'kwarg_2': 2}
"""
def func(**kwargs):
    value_01 = kwargs.get("key_01")
    value_02 = kwargs.get("key_02")
    print(value_01, value_02)


# **dict 相当于将 key_01=1, key_02=2 传入函数参数
# func(**dict_value) = func(key_01=1, key_02=2)
# func(key_01=1, key_02=2)
dict_value = {"key_01": 1, "key_02": 2}
func(**dict_value)
func(key_01=1, key_02=2)

2. 三元运算符

if-else 语句

# 普通判断语句
a = 10
if a < 11:
    a += 1
    print(a)
else:
    a -= 1
    print(a)
"""result:
11
"""
    
# 三元表达式 
# 格式:(变量1) = 符合条件返回:(变量 or 常量 or 表达式) if (条件) else 否则不符合条件返回:(变量 or 常量 or 表达式)
a = 10
b = a + 1 if a < 11 else a - 1
print(b)
"""result:
11
"""

3.列表推导式

# 列表推导式 生成一个列表 0-99 能被2整除 或者 能被3整除的自然数
a_list = [x for x in range(0, 100) if x % 2 == 0 or x % 3 == 0]
print(a_list)
 
# result:
[0, 2, 3, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 26, 27, 28, 30, 32, 33, 34, 36, 38, 39, 40, 42, 44, 45, 46, 48, 50, 51, 52, 54, 56, 57, 58, 60, 62, 63, 64, 66, 68, 69, 70, 72, 74, 75, 76, 78, 80, 81, 82, 84, 86, 87, 88, 90, 92, 93, 94, 96, 98, 99]

4.数值互换

# python 可以直接进行数值互换
a = 1
b = 2
c = 3

a, b, c = b, c, a
print(a, b, c)
# result:
3 1 4

5.反转

# 字符串反转
str1 = "123456789"
print(str1[::-1])
# 987654321

# 列表反转
list1 = [1, 2, 3, 4, 5, 6, 7]
print(list[::-1])
# [7, 6, 5, 4, 3, 2, 1]

6.for - else 组合

# for-else 语句。
for i in [1, 2, 3, 4]:
    print(i)
    if i == 1:
        # 当执行 break 语句时, else是不会执行的。
        break
# 只要执行完 for 循环语句就会执行 else。        
else:
    print("I am else")

7. lambda 匿名函数

# x, y 是参数, x + y 是返回值
func = lambda x, y: x + y
print(func(1, 2))
# result:
# 3

8.生成器 和 迭代器

# 迭代器 
class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 
  def __next__(self):
    x = self.a
    self.a += 1
    return x
 
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
"""result:
1
2
3
"""

# 生成器 (本质上也是迭代器)
# for 循环条件 迭代对象必须是可迭代对象
def get_number():
    for data in range(0, 100):
        # 有 yield 的就叫做生成器
        yield data

a1 = get_number()
print(next(a1))

9.装饰器

def func(func):
    def inner(*args, **kwargs):
        print("this is a xxsg")
        result = func(*args, *kwargs)
        print(result)
        return result
    return inner


@func
def print_hxc(*args, **kwargs):
    print(args)
    print("xxsg")
    print("xxsg")
    return "xxsgg"


# print_hxc = func(print_hxc) # 这个等价于 @func 
# print_hxc = inner
# print_hxc(1, 2, 4) = inner(1, 2, 4)
print_hxc(1, 2, 4)

10. 遍历文件夹

path_list = []


# 遍历所有文件夹
def show_file(path="C:\TroilaProject"):
    """

    :param path: 项目存放的路径
    :return:  返回项目
    """
    if os.path.isdir(path):
        files = os.listdir(path)
        for file_path in files:
            new_file_path = os.path.join(path, file_path)
            # print(new_file_path)
            show_files(new_file_path)
            if os.path.isfile(new_file_path):
                path_list.append(path)
    return list(set(path_list))
posted @ 2021-02-17 20:31  隔江千万里  阅读(53)  评论(0)    收藏  举报