第一节—python基础知识

本文详细介绍了Python编程的基础知识,包括字符串处理、编码转换、函数参数、循环及生成器等内容,适合初学者快速掌握Python核心概念。

1、查缺补漏

1、Python允许用r’‘表示’’ "内部的字符串默认不转义。

2、使用\n进行换行不方便的时候,使用

>>> print('''line1
... line2
... line3''')
line1
line2
line3

3、Python提供了ord():字符转换成编码,chr()函数把编码转换为对应的字符

4、字符串和字节形式

1、由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。

x = b'ABC' 是字节型
x ='ABC' 是字符串类型

2、以Unicode表示的str通过encode()方法可以编码为指定的bytes

>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

3、把bytes变为str,就需要用decode()方法:

>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'

正常情况下包含无法解码的字节就会报错,这里可以传入errors='ignore’忽略错误的字节

>>> b'\xe4\xb8\xad\xff'.decode('utf-8')
Traceback (most recent call last):
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte
>>> b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')
'中'

4、len()可以计算字符串长度或则字节长度

>>> len('ABC')
3
>>> len('中文')
2
>>> len(b'ABC')
3
>>> len(b'\xe4\xb8\xad\xe6\x96\x87')
6
>>> len('中文'.encode('utf-8'))
6

5、在操作字符串时,我们经常遇到str和bytes的互相转换。为了避免乱码问题,应当始终坚持使用UTF-8编码对str和bytes进行转换。

5、函数的参数

1、位置参数:就是传入的参数,按位置顺序赋值给函数。

def power(x, n):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

这两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次赋给参数x和n。
2、默认参数:这里就是解决函数的重载问题的,设置一个默认的值。
power(x)用来计算x²,power(x,n)计算x的n次幂。python由于是弱类型语言不支持函数重载,但是可以给n赋予一个默认值。

def power(x, n=2):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

power(5)就是默认调用power(5,2) power(5,3)则是另外一个函数。
切记:默认参数必须放在后面。
切记:默认参数必须指向不变对象。

def add_end(L=[]):/*如果不传入实际列表,就传入一个空列表作为默认参数*/
    L.append('END')
    return L

正常调用没有问题。

>>> add_end([1, 2, 3])
[1, 2, 3, 'END']
>>> add_end(['x', 'y', 'z'])
['x', 'y', 'z', 'END']

但是使用默认函数多次调用就出问题了,因为L[]是一个可变的参数。
Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。

>>> add_end()
['END', 'END']
>>> add_end()
['END', 'END', 'END']

3、可变参数:顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。
首先:可以采用传入一个列表或则元组。

def calc(numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum

这时候调用函数必须将参数封装起来,封装成一个列表或则元组。

>>> calc([1, 2, 3])
14
>>> calc((1, 3, 5, 7))
84

其次,为了不每次都封装一个元组或则列表,改函数为。

def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum

这时候的调用方式

>>> calc(1, 2)
5
>>> calc()
0
>>> nums = [1, 2, 3]
>>> calc(nums[0], nums[1], nums[2])
14
>>> nums = [1, 2, 3]
>>> calc(*nums)
14

4、关键字参数:就是**kw,这里传入的是一个字典。这里就是一个补录吧,关键字参数没有指定,也可以是一个空字典。

def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)

只有名字和年龄是必选信息,其他的在字典中只是一个补录。

>>> person('Michael', 30)
name: Michael age: 30 other: {}

也可以传入补录信息。

>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}

用封装好的字典传入。

>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, city=extra['city'], job=extra['job'])
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

5、命名关键字参数:在关键字参数中传入的参数名是不受限制的,很可能是完全不必要的。
这里命名关键字参数,就多了个命名,也就是已经确定好需要那些参数了。
首先,可以def person(name, age, *, city, job):在命名关键字参数前面加一个*。

def person(name, age, *, city, job):
    print(name, age, city, job)
>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer

其次,如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:def person(name, age, *args, city, job):

def person(name, age, *args, city, job):
    print(name, age, args, city, job)

注意:命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错。

def person(name, age, *args, city, job):
    print(name, age, args, city, job)
>>> person('Jack', 24, 'Beijing', 'Engineer')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: person() takes 2 positional arguments but 4 were given

命名参数可以有缺省值。

def person(name, age, *, city='Beijing', job):
    print(name, age, city, job)
>>> person('Jack', 24, job='Engineer')
Jack 24 Beijing Engineer

6、循环

1、对于字典
对字典的关键字进行循环 for key in d:
对字典的值进行循环for value in d.values()
对字典的关键字和值同时迭代for k, v in d.items()
2、列表生成器
(1)要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1, 11))

>>> list(range(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

(2)在[]内部书写循环构建复杂的列表

>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

(3)for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:

>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]

(4)还可以在后面构建一个双重循环

>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

(5)使用多个变量创建列表

>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> [k + '=' + v for k, v in d.items()]
['y=B', 'x=A', 'z=C']

(6)把列表中的字母都变成小写的

>>> L = ['Hello', 'World', 'IBM', 'Apple']
>>> [s.lower() for s in L]
['hello', 'world', 'ibm', 'apple']

(7)if…else…的应用
在一个列表生成式中,for前面的if … else是表达式,而for后面的if是过滤条件,不能带else。

>>> [x if x % 2 == 0 else -x for x in range(1, 11)]
[-1, 2, -3, 4, -5, 6, -7, 8, -9, 10]

7、生成器

1、概念:
列表问题:由于使用列表时候,很可能只使用前面几个元素,但是后面还有一百万个无用数据,太浪费空间了。
解决:用生成器保存算法,用多少提取多少。

>>> g = (x * x for x in range(10))

就是把上面的[]换成(),这样保存的是算法而不是数据本身。
2、输出数据
(1)通过for循环输出

>>> g = (x * x for x in range(10))
>>> for n in g:
...     print(n)
... 
0
1
4
9
16
25
36
49
64
81

(2)通过next(g)输出,按顺序向下输出。

>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
>>> next(g)
16

3、yield的概念:相当于return,而且将所在的函数编程生成器,就可以使用next(g)和send(g)函数了。

def foo():
    print("starting...")
    while True:
        res = yield 4
        print("res:",res)
g = foo()
print(next(g))
print("*"*20)
print(next(g))
输出:
starting...
4
********************
res: None
4

1.程序开始执行以后,因为foo函数中有yield关键字,所以foo函数并不会真的执行,而是先得到一个生成器g(相当于一个对象)

2.直到调用next方法,foo函数正式开始执行,先执行foo函数中的print方法,然后进入while循环

3.程序遇到yield关键字,然后把yield想想成return,return了一个4之后,程序停止,**并没有执行赋值给res操作,**此时next(g)语句执行完成,所以输出的前两行(第一个是while上面的print的结果,第二个是return出的结果)是执行print(next(g))的结果,

4.程序执行print("*"20),输出20个

5.又开始执行下面的print(next(g)),这个时候和上面那个差不多,不过不同的是,这个时候是从刚才那个next程序停止的地方开始执行的,也就是要执行res的赋值操作,这时候要注意,这个时候赋值操作的右边是没有值的(因为刚才那个是return出去了,并没有给赋值操作的左边传参数),所以这个时候res赋值是None,所以接着下面的输出就是res:None,

6.程序会继续在while里执行,又一次碰到yield,这个时候同样return 出4,然后程序停止,print函数输出的4就是这次return出的4.
(来自于https://blog.youkuaiyun.com/mieleizhi0522/article/details/82142856)

本地跟单专家顾问(EA)是一种专为MetaTrader 4平台设计的自动化交易工具。该版本强调其无限制特性,允许用户在任何时段、不同地理区域及各类账户上自由部署,从而为交易者提供了高度灵活的操作空间。其核心机制采用同向复制策略,即接收端会完全模仿发送端的交易方向与操作,适合那些信赖信号源稳定性的用户,以期通过跟随策略实现相近的投资回报。 系统架构包含两个独立模块:信号发送端与信号接收端。发送端安装于主导交易决策的账户,接收端则配置于需同步执行的账户,二者协同工作,实现了交易指令的自动传递与执行,有效减少了人工干预的需求。此外,该工具特别注重与MT4服务器时间的同步,确保交易执行时点的精确性,避免因时区偏差可能引发的操作失误,这对于依赖时间敏感性的外汇市场尤为重要。 文件标识中的特定代号可能指向开发者的内部版本标记或某种定制化交易逻辑,具体含义需结合进一步的技术文档予以确认。整体而言,该EA为多账户管理与策略复制提供了一个集成化解决方案,有助于提升交易执行的效率并降低操作风险。但需注意,市场环境处于持续变动中,任何自动化工具均需经过充分验证与适应性测试,历史表现不能作为未来收益的保证。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
针对XMC1300系列微控制器的直流无刷电机驱动软件开发方案(嵌入式系统设计) 本方案详细阐述基于英飞凌XMC1300系列微控制器的直流无刷电机控制系统的软件实现方法。该方案专注于嵌入式环境下的电机驱动程序设计,涵盖核心控制算法、硬件资源调度及系统稳定性保障等关键技术环节。 在具体实施层面,开发工作将围绕磁场定向控制原理展开,通过精确的转子位置检测与电流闭环调节,实现电机的高效平稳运行。系统软件架构采用模块化设计,包括PWM信号生成模块、ADC采样处理模块、保护机制模块以及通讯接口模块。其中,PWM模块负责输出六路互补信号以驱动三相逆变桥;ADC模块用于实时采集相电流与直流母线电压;保护机制模块集成过流、过压及过热检测功能,确保系统运行安全。 开发过程需严格遵循嵌入式软件工程规范,重点考虑代码执行效率与资源占用优化。程序将充分利用XMC1300芯片内置的CCU4、CCU8定时器单元及快速模拟数字转换器,以实现高精度定时与快速电流采样。同时,软件设计中融入了位置估算算法与启动策略,确保电机在无传感器模式下仍能可靠启动并稳定运行。整个驱动方案旨在构建一个响应迅速、控制精确且鲁棒性强的电机控制系统。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值