Python学习笔记之尾递归

2019-9-21 张宇童 Python

# 尾递归函数
# 自己调用自己的函数,且非表达式的递归函数,只开辟一个栈帧空间
# 尾递归的值是在参数重做运算的

# example factorial function
def factorial(n, x = 1):
    if n <= 1: return x
    return factorial(n - 1, n * x)
res = factorial(3)
print(res) # 6

标签: python 学习笔记

评论(0) 浏览(553)

Python学习笔记之内置函数

2019-9-21 张宇童 Python

# 内置函数
# abs() 绝对值函数
res = abs(-99 )
print(res)

# round 四舍五入 n.5的情况下 奇进偶不进
# 3.5 ===》 4
# 4.5 ===〉 4
res = round(8.5)
print(res)# 8

# sum 计算一个列表中的和
listvar = [1,2,3]
res = sum(listvar)
print(res) # 6

setvar = (1,2,3)
res = sum(setvar)
print(res) # 6

# max 获取一个列表中最大数
listvar = [1,2,33,4,5]
res = max(listvar)
print(res) # 33

# min 获取一个列表最小数
listvar = [33,44,11,22,33]
res = min(listvar)
print(res) # 11

# pow 计算某个数值的x次幂
res = pow(2,3) # 计算2的3次幂
print(res) # 8
# 如果加上第三个参数,意味把前两个数的值和第三个取模
res = pow(2,3,6)
# 计算流程 2**3%6
print(res)

# range 产生指定范围的可迭代对象
# range(start, [ end, [ step]])

# bin 将是进制数字转换为2进制
res = bin(3) 
print(res) # 0b11

# oct 将十进制转换为8进制
res = oct(8) 
print(res) # 0o10

# hex 将十进制转换为16进制
res = hex(16)
print(res) # 0x10

# chr 将ASCII码转为数字
res = chr(64)
print(res) # @

# ord 将字符转换为ASCII码
res = ord('1') 
print(res) # 49

# eval 将字符串转为python代码执行
eval('print("我是字符串")')
# error : eval('a = 6')

# exec 将字符串转为python 能够实现更多复杂操作
res = exec('a = 5')
print(a)
strvar = '''
listvar = [1,2,3,4,5,6,7,88]
for i in listvar:
    print(i, end='')
print()
'''
exec(strvar) # 123456788

# repr 不转义字符,转义成解释器读取的形式
strvar = 'hello world'
print(repr(strvar)) # 'hello world'  

# input 接受输入字符串
res = input('张宇童博客好不好')
# 线程阻塞 无论输入什么都是字符串类型
print(res)
print('end')

标签: python 学习笔记

评论(0) 浏览(583)

Python学习笔记之高阶函数

2019-9-20 张宇童 Python

# 高阶函数 
# 内置 map reduce sorted filter
# ## map
'''
map(func, iterable)
功能:把 iterable 中的 一个一个的拿到 func 函数中 如果符合条件就存在迭代器中
参数:
    func: 内置函数 或者 自定义函数
    iterable: 可迭代性数据
                容器类型数据,range(),迭代器
返回值:
'''
# example 获取给定列表的整数型
listvar = ['1','2','3']
print(listvar)
# 常规写法
N = 0
for i in listvar:
    listvar[N] = int(i)
    N += 1 
# append(可以向list中添加元素)
# listvar.append(66)
print(listvar, '<===>')

# 将list 转为iter接口类型
listvar = [1,2,3,4,5]
from collections.abc import Iterable, Iterator
tempInt = map(int, listvar)
print(isinstance(tempInt, Iterable))
print(isinstance(tempInt, Iterator))
print(tempInt)

# 计算给定列表的2次幂
listtemp = [1,2,3,4,5]
listtemp2 = []
def cimi (x) :
    return x**2
listtemp2 = map(cimi,listtemp)
for i in listtemp2:
    print(i)


# reduce 函数
'''
reduce(func, iterable)
功  能:      把可迭代数据的前前个值放到func中进行运算,计算的结果在和iterable中的第三个值进行运算,
         以此类推不停的拿结果和iterable中的下一个数据进行运算,知道结束
参  数:  func 内置或自定义函数,iterable 可迭代数据 (容器类型数据,迭代器,range对象)
返回值:  最后的结果
'''
# 将 listvar 转为 整数。12345
# 普通写法
listvar = [1,2,3,4,5]
strvar = ''
for i in listvar:
    strvar += str(i)
print(strvar, type(int(strvar))) # 12345 <class 'int'>
# reduce 写法
# 引入reduce
from functools import reduce
def func (a, b) :
    return a*10+b
res = reduce(func, listvar)
print(res, type(res)) # 12345 <class 'int'>

# 在不使用int的情况下把 '987' (str) 变为 987 (int)
listvar = '987'


# sorted 
'''
 sorted(iterable, reverse = False, key = 函数)
 功能:sorted对序列进行排序
 参数:
    iterable:可迭代数据(容器类型数据,迭代器,range)
    reverse:是否反转
    key:内置或自定义的函数
 返回值:
    返回排序后的结果
'''
# example 
tuplevar = (1,3,-5,-2,4)
res = sorted(tuplevar) # [1, 2, 3, 4, 5] 默认# 高阶函数 
# 内置 map reduce sorted filter
# ## map
'''
map(func, iterable)
功能:把 iterable 中的 一个一个的拿到 func 函数中 如果符合条件就存在迭代器中
参数:
    func: 内置函数 或者 自定义函数
    iterable: 可迭代性数据
                容器类型数据,range(),迭代器
返回值:
'''
# example 获取给定列表的整数型
listvar = ['1','2','3']
print(listvar)
# 常规写法
N = 0
for i in listvar:
    listvar[N] = int(i)
    N += 1 
# append(可以向list中添加元素)
# listvar.append(66)
print(listvar, '<===>')

# 将list 转为iter接口类型
listvar = [1,2,3,4,5]
from collections.abc import Iterable, Iterator
tempInt = map(int, listvar)
print(isinstance(tempInt, Iterable))
print(isinstance(tempInt, Iterator))
print(tempInt)

# 计算给定列表的2次幂
listtemp = [1,2,3,4,5]
listtemp2 = []
def cimi (x) :
    return x**2
listtemp2 = map(cimi,listtemp)
for i in listtemp2:
    print(i)


# reduce 函数
'''
reduce(func, iterable)
功  能:      把可迭代数据的前前个值放到func中进行运算,计算的结果在和iterable中的第三个值进行运算,
         以此类推不停的拿结果和iterable中的下一个数据进行运算,知道结束
参  数:  func 内置或自定义函数,iterable 可迭代数据 (容器类型数据,迭代器,range对象)
返回值:  最后的结果
'''
# 将 listvar 转为 整数。12345
# 普通写法
listvar = [1,2,3,4,5]
strvar = ''
for i in listvar:
    strvar += str(i)
print(strvar, type(int(strvar))) # 12345 <class 'int'>
# reduce 写法
# 引入reduce
from functools import reduce
def func (a, b) :
    return a*10+b
res = reduce(func, listvar)
print(res, type(res)) # 12345 <class 'int'>

# 在不使用int的情况下把 '987' (str) 变为 987 (int)
listvar = '987'


# sorted 
'''
 sorted(iterable, reverse = False, key = 函数)
 功能:sorted对序列进行排序
 参数:
    iterable:可迭代数据(容器类型数据,迭代器,range)
    reverse:是否反转
    key:内置或自定义的函数
 返回值:
    返回排序后的结果
'''
# example 
tuplevar = (1,3,-5,-2,4)
res = sorted(tuplevar) # [1, 2, 3, 4, 5] 默认从小到大升序排列
print(res)
res = sorted(tuplevar, reverse = True)
print(res) # [5, 4, 3, 2, 1] 对序列进行倒序排列
# 使用内置函数排序
res = sorted(tuplevar, key = abs) # [1, -2, 3, 4, -5]
print(res)从小到大升序排列
print(res)
res = sorted(tuplevar, reverse = True)
print(res) # [5, 4, 3, 2, 1] 对序列进行倒序排列
# 使用内置函数排序
res = sorted(tuplevar, key = abs) # [1, -2, 3, 4, -5]
print(res)
# filter 
'''
filter(func, iterable)
功能: 过滤数据
    return False 舍弃数据
    return True  保留数据
参数:
    func: 自定义函数
    iterable: 可迭代数据(容器类型数据,range,迭代器)
返回值: 
    迭代器
'''
from collections.abc import Iterable, Iterator
listvar = [1,2,3,4,5,6,7,8]
def oushu(n):
    return True if n % 2 != 1 else False
res = filter(oushu, listvar) 
print(isinstance(res, Iterator)) # True
print(list(res)) # [2, 4, 6, 8]
# 改写上述案例
print(list(filter(lambda n: True if n % 2 != 1 else False, listvar))) # [2, 4, 6, 8]

# 内置函数

标签: python 学习笔记

评论(0) 浏览(592)

Python学习笔记之迭代器

2019-9-20 张宇童 Python

# 迭代器
# 能被next()调用,并不断的返回下一个值,叫迭代器
# 判断容器类型的迭代性
listvar = [1,3,3,5,6,7,8]
from collections.abc import Iterable,Iterator # Iterable 迭代性  |  Iterator 迭代器
for i in listvar:
    print(i)

res = isinstance(listvar, Iterable)
print(res)
res = isinstance(listvar, Iterator)
print(res)

# 判断range对象的迭代性
for i in range(6):
    print(i)
res = isinstance(range(6), Iterable)
res1 = isinstance(range(6), Iterator)
print(res, res1) # True 表示有迭代性  |  False 表示不是迭代器

# 把容器类型数据变为迭代器
listvar = [1,2,3]
listvarIterator = iter(listvar)
res = isinstance(listvarIterator, Iterator)
print(res) # True 表示是迭代器

# 使用next() 对迭代器进行调用
res = next(listvarIterator)
print(res) # 1
res = next(listvarIterator)
print(res) # 2
res = next(listvarIterator)
print(res) # 3

print('<-<-<-<-<-<-<-<-<<<-华丽分割线->>>->->->->->->->->')
for i in listvarIterator:
    print(i)

# range 迭代器
rangevar = iter(range(5))
print(isinstance(rangevar, Iterable)) # True
print(isinstance(rangevar, Iterator)) # True
print(next(rangevar)) # 0

标签: python 学习笔记

评论(0) 浏览(512)

Python学习笔记之lambda

2019-9-20 张宇童 Python

# 匿名函数
# lambda 函数
# example 不带参数
func = lambda: 'hello world'
res = func()
print(res)
# example 带参数
func = lambda n : print('欢迎来到%s博客' % (n))
func('张宇童') # 欢迎来到张宇童博客

# 类似于三元运算符
# True if Expression else False
titleName = '张宇童博客'
res = '是的' if '张宇童' in titleName else '不是'
print(res) # 是的

func = lambda n : '奇数' if n % 2 else '偶数'
print(func(4))

标签: python 学习笔记

评论(0) 浏览(514)

Python学习笔记之闭包

2019-9-20 张宇童 Python

# 内部函数
# 函数本身是可以互相嵌套的
# example
def whyBlogName():
    def thisIsName():
        print('张宇童博客')

whyBlogName()

# nonlocal 用来修饰局部变量
# nonlocal 寻找当前作用域的上一级作用域的变量
# name = '123'
def blogName() :
    name = '张宇童blog'
    def sayTitle():
        nonlocal name
        name = 'www.zyt8.cn'
    sayTitle()
    print(name)
blogName()

def listvarset():
    a = 1
    listvar = [a, 2, 3]
    def setlist():
        listvar[0] = 10
    setlist()
    print(a)
listvarset()

# 闭包函数
'''
    定义:内函数使用外函数的局部变量,并且外函数将内函数返回出来的方法
        而里面的内函数叫闭包
'''
# example 
def zhangyutong_blog():
    name = '原创'
    def url():
        print('张宇童说过一句话,%s才是最好的经验' % (name))
    return url
res = zhangyutong_blog()
res()
# 递归
def digui(a):
    if a <= 0:
        return 0
    return digui(a-1) + a
res = digui(3)
print(res)

# example2
def blog_function():
    name = '张宇童'
    title = '%s - 前沿技术博客' % (name)
    url = 'http://www.zyt8.cn'
    pv = 1000
    ip = 500
    blog_number = 60
    def writeBlog(new_blog_number):
        nonlocal pv,ip,blog_number
        blog_number += new_blog_number
        pv += new_blog_number*300
        ip += new_blog_number*100
    def delBlog(del_blog_number):
        nonlocal pv,ip,blog_number
        blog_number -= del_blog_number
        pv -= del_blog_number*200
        ip -= del_blog_number*50
    def moodGood(number):
        writeBlog(number)
        print('%s今天心情不错,写了%d篇博文,现在一共%d篇博文啦,pv增加到%d,ip增加到%d' % (name, number, blog_number, pv, ip))
    def moodBad(number):
        delBlog(number)
        print('%s今天心情很糟糕,删除了%d篇博文,当前还剩%d篇博文,pv减少到了%d,ip减少到了%d' % (name, number, blog_number, pv, ip))
    def behavior():
        return (moodGood, moodBad)
    return behavior
res = blog_function()
func = res()
func[0](3)
func[1](1)
blog_function()()[0](1)

标签: python 学习笔记

评论(0) 浏览(522)

Linux下使用PHP给视频加水印

2019-9-20 张宇童 关注网络

效果图

333.png

444.png

 1、首先升级yum

sudo yum install epel-release -y
sudo yum update -y 

2、安装Nux Dextop Yum 源
sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
3、安装FFmpeg 和 FFmpeg开发包
sudo yum install ffmpeg ffmpeg-devel -y
4、测试
ffmpeg 最后没报错说明安装成功
5、执行
# 该命令执行的效果:在 01.mp4 文件上添加 01.png 水印 并将新生成的视频文件保存为 02.mp4
ffmpeg -i 01.mp4 -i 01.png -filter_complex overlay 02.mp4
6、php 控制 Linux 命令
$cmd = 'ffmpeg -i 01.mp4 -i 01.png -filter_complex overlay 03.mp4'; exec($cmd); 
7、相关ffmpeg命令
1.实现每隔10秒交替出现logo
ffmpeg -y -t 60 -i input.mp4 -i logo1.png -i logo2.png -filter_complex "overlay=x=if(lt(mod(t\,20)\,10)\,10\,NAN ):y=10,overlay=x=if(gt(mod(t\,20)\,10)\,W-w-10\,NAN ) :y=10" output.mp4
60 编辑视频时长,如果填写只会处理并输出前60秒的视频,不填写会处理整个视频 x 水印的左上角的x坐标 y 水印的左上角的y坐标 input.mp4 输入的视频文件(需要处理的) output.mp4 输出的视频文件(已经处理完成的) if(gt(mod(t,20),10),W-w-10,NAN )中第二个10说logo出现的时长,即是说水印会显示10秒
2.实现跑马灯
ffmpeg -i input1 -i input2 -vcodec libx264 -an -filter_complex "overlay=x='if(gte(t,2), -w+(t-2)*20, NAN)':y=0" -s 320x240 output.mp4 input1 放在底部的视频 input2 放在上面的视频 320x240 输出视频的宽高 3.实现2秒后logo从左到右移动
ffmpeg -i input.mp4 -vf "movie=logo.png[logo];[in][logo]overlay=x='if(gte(t\,2)\,((t-2)*80)-w\,NAN)'" output.mp4
80 移动的距离,单位像素
4.实现gif格式的logo循环命令
ffmpeg -i video.mpg -ignore_loop 0 -i loop.gif -filter_complex  "[0:v][1:v]overlay=10:10:shortest=1" -vcodec mpeg2video out.mpg
5.实现视频添加字幕
ffmpeg  -i  input  -vf  drawtext=fontfile=arial.ttf:text=welcome output
6.实现周期显示输入的文字水印
ffmpeg -i input.mp4 -vf "drawtext=fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf:text='testtest':x=w-100:y=100:enable=lt(mod(t\,3)\,1):fontsize=24:fontcolor=yellow@0.5:shadowy=2" output.mp4
7.编写代码遇到错误
Cannot create buffer sink ret = -12 
修改
AVFilter *buffersrc  = avfilter_get_by_name("buffer");
AVFilter *buffersink = avfilter_get_by_name("buffersink");

标签: ffmpeg linux php

评论(0) 浏览(875)

Python学习笔记之全局变量与局部变量

2019-9-19 张宇童 Python

# 局部变量在函数内部定义的变量是局部变量
# 全局变量在函数外部定义的变量 或 在函数内部global定义的变量为全局变量
# 作用域:
#   局部变量在函数的内部
#   全局变量的作用域横跨整个文件
'''
example 全局变量
'''
url = 'http://www.zyt8.cn'
def funcGlobal () :
    # 在函数内部修改全局变量 需使用global函数
    global url
    print('张宇童的博客地址是%s' % (url))
    url = 'http://blog.ecuuu.com'
funcGlobal ()   # 张宇童的博客地址是http://www.zyt8.cn
print(url)      # http://blog.ecuuu.com
'''
example 局部变量
'''
def funcPart ():
    name = '张宇童博客'
    print(name)
funcPart()
# print(name) # NameError: name 'name' is not defined

# 如果函数外没有global声明的变量将声明一个全局变量
# 如果函数外部有global声明的变量将可以直接修改 被global声明的变量

# locals 和 globals
# locals 当前作用域里面的所有变量
# 获取当前作用域范围内的所有变量
a = '张宇童'
b = 'http://www.zyt8.cn'
res = locals()
print(res)

def localsExample():
    a = '张宇童'
    res = locals()
    print(res)
localsExample()

标签: python 学习笔记

评论(0) 浏览(501)

Python学习笔记之函数文档

2019-9-19 张宇童 Python

# __doc__魔术属性 查看函数文档
# 方式一: print(print.__doc__)
# 方式二: help(print)

def chao_jidan(container):
    '''
    功能: 吃饱
    参数: 容器
    描述: 如何填饱肚子
    '''
    print('鸡蛋炒好了放在%s里了' % (container))
    return '西红柿没有抄'

res = chao_jidan('盘')
print(res)
help(chao_jidan)

标签: python 学习笔记

评论(0) 浏览(476)

Python学习笔记之函数定义

2019-9-19 张宇童 Python

# 时间: 2019年9月19日 20:45
# 函数的定义
'''
基本语法
def functionName ():
    pass
'''

def say():
    print('看张宇童博客,站在巨人的肩膀上')

say() # 看张宇童博客,站在巨人的肩膀上
'''
函数的命名
字母数字下划线,首字符不能为数字
严格区分下划线,且不能使用关键字
函数命名有意义,且不能使用中文哦
'''

'''
驼峰命名法:
    1、大驼峰命名法 ThisIsZhangYuTongBlog  (用于类的命名)
    2、小驼峰命名法 thisBlog               (用于函数命名)
    3、普通情况下一般用下划线命名 this_is_zhangyutong_blog
'''
i = 1
while i <= 10: 
    print('%d、' % (i),end="")
    say()
    i+=1

# 默认函数参数
def say(name = '没有输入名字'):
    print(name)

say('132')
say() 

# 普通收集参数 用于收集多余的普通实参
# def func(*args) 在参数名前加* 则为普通收集参数
def func(a,b,*c):
    print(a,b,c)
# 普通收集参数将收集到的参数存放在元组中
func(1,3,2,53,2) # 1 3 (2, 53, 2)

def add(*args):
    n = 0
    for i in args:
        n += i
    print(n) 
add(1,2,3) # 6


# 关键字收集参数
# 专门用于收集多余的关键字实参
# def func(**kwargs):
#     pass
def say_hello(blogName, blogUrl, **kwargs):
    print(blogName, blogUrl)
    print(kwargs)
'''
张宇童博客 http://www.zyt8.cn
{'describe': '博文很精彩', 'contentDesc': '内容全原创'}
''' 
say_hello('张宇童博客', blogUrl = 'http://www.zyt8.cn', describe = '博文很精彩', contentDesc = '内容全原创')

# 命名关键字参数
'''
def func( arg1, *, arg2, arg3 ):
    pass
语法:在函数定义是写在*号后面的arg2是命名关键字参数
作用:在函数调用的时候必须使用关键字实参进行调用
'''
# example
def func(arg1, arg2, arg3):
    print(arg1, arg2, arg3)
func(123,321,213) # 123 321 213

def func(arg1, arg2, *,arg3 = ''):
    print(arg1, arg2, arg3)
func(123,321,arg3 = {'1': '123'}) # 123 321 123

# 关于 * 和 ** 的用法
'''
*  用来修饰容器类型,把容器内数据展开
** 用来修饰字典类型
example
func(*arg1, **arg2)
'''
def function (name, hello, url) :
    print(name,hello,url)
listvar = [1,2,3]
dictvar = {'name': '张宇童', 'url': 'http://www.zyt8.cn','hello': 'world'}
# function(*listvar)
function(**dictvar)

# 型参声明的排序
# 普通参数,默认参数,普通收集参数,命名关键字参数,关键字收集参数

print(print.__doc__)

标签: python 学习笔记

评论(0) 浏览(455)

Powered by emlog